1

PostgreSQL を使用する場合、シーケンスの名前を lastInsertId() に渡す必要があります。これにより、ID を持つデータベースからクエリが返されなかったと考えられ、代わりに lastInsertId($seqname) が余分なクエリを実行しており、競合状態になりやすい可能性があります (別の行が同時に挿入された場合、私は間違った結果になります)。

ドキュメントを読んで、同じ考えを示すこのコメントを見つけました: http://www.php.net/manual/en/pdo.lastinsertid.php#83440。5年前のもので、最近のものは見つかりませんでした。

どう思いますか?

4

3 に答える 3

4

これを信頼できるものにするには、次のことを行う必要があります。

  • 一度に 1 つのレコードのみを挿入します。
  • シーケンス名を指定します。と
  • lastInsertIdセッション レベルの接続プーリングを使用するか、トランザクション レベルのプーリングを使用して同じトランザクション内で挿入と両方を実行することにより、同じセッションでフォローアップ クエリを実行します 。

PDO が結果セットから挿入された ID を使用して取得する方がはるかに優れています。INSERT ... RETURNINGそうすれば、次の場合に適切な値が得られます。

INSERT INTO mytable(col1,col2)
VALUES (1,'a'),  (2,'b'),  (3,'c')
RETURNING id;

lastInsertId挿入された最後の行の ID のみを取得します。前の行が連続した ID を取得したとは想定できません。lastInsertIdisの場合、前の行がそうであるという保証42なく、 ID を要求する同時挿入が存在する可能性もあります。4140

ですから、「安全です」の答えlastInsertIdは…ちょっと。を正しく使用するために必要な制約内で使用すれば安全ですがcurrval、理想とはほど遠いものです。個人的にはそれを避けてINSERT ... RETURNING代わりに使用します。

于 2013-08-09T15:10:18.363 に答える
2

これはSELECT currval('seq_name')、接続ごとに最後に生成されたものを返します。だから信頼できる。

于 2013-08-09T14:42:17.867 に答える
1

シーケンスの唯一の目的は、一貫性を保つことです。

そうでなければ、彼らは役に立たないでしょう。

于 2013-08-09T14:40:55.393 に答える