1

PHPとMySQLを使用しています。

ゴール:

自動インクリメント ID 列を持つテーブルに新しい行を挿入します。
この新しい行を挿入するときに、新しく挿入された行の自動インクリメント ID # を同じ行/エントリの別の列にコピーしたいと思います。
作成時に、新しいエントリ/行には、自動インクリメントされた id 列と同じ番号の別の列が必要です。

私の最大の懸念
は、他の接続からの他のトランザクションがサーバー上で発生している可能性がある場合でも、これらすべてが正しく確実に行われる必要があることです。

これまでのところ


私はlast_insert_id () について少しだけ知っています...そして、これを自分のニーズに確実に使用できるようになることを恐れています...おそらく別の接続からのいくつかの他の挿入クエリ) そして今、私は正しい ID を取得しません #? (接続ごとに last_insert_id() がクライアントに与えられたときの意味を完全には理解していませんでした)。

トランザクションがロールバックされると未定義になるため、last_insert_id() はトランザクションでうまく機能しますか? (別のトランザクションがロールバックされた直後にこのスクリプトを実行すると、スクリプトは last_insert_id() に対して NULL を返しますか?)

mysql_insert_id(); がわかりません。それを使用する方法と、それが私を助けるかどうか。

これまでのところ、次のことを考えてきました。

  1. columnlast_insert_id() として設定されたINSERT 行;
  2. 行を挿入します。UPDATE columnwith SELECT last_insert_id();
  3. SELECT last_insert_id(); last_insert_id()+1 を使用しauto-increment columnて行を挿入column

選択した値を自動インクリメント列に挿入するとどうなりますか? 自動インクリメント ジェネレーターは、挿入した数値からカウントを開始しますか? 以前に使用された (しかし、もう存在しない) 値を使用し、その値の後に id # を持つレコードが存在する場合はどうすればよいですか?

テーブルまたは行をロックすると、目的の動作を実現できますか?

このようなことを行う適切な/正しい方法は何ですか?



"last_insert_id() は接続ごとにクライアントに与えられます"

last_insert_id はクライアントに依存せず、そのクライアントから最後に挿入された行の ID を返すため、別の接続のユーザーがデータベースとトランザクションを行う場合について心配する必要はありません。

それが何を意味するのか、私はまだ完全には理解していません...

基本的なシナリオの場合:

INSERT row where id = 1;
SELECT last_insert_id(); outputs 1

Person A makes a connection to the db; SELECT last_insert_id(); outputs 1.
Person B makes a connection to the db; SELECT last_insert_id(); outputs 1?

Person A INSERT another row where id = 2;

Person A SELECT last_insert_id(); outputs 2?
Person B SELECT last_insert_id(); outputs... 1 or 2??

そこで何が起こるの?


そして、私が本当に気になるシナリオ:

Person A makes a connection with the db;
Person A SELECT last_insert_id(); outputs 1

Person A INSERT row where id = 2;
Person A SELECT last_insert_id(); outputs 2

Person B makes a connection with the db;
Person B SELECT last_insert_id(); outputs 2
Person B INSERT row where id = 3;

Person A SELECT last_insert_id(); outputs 2??
Person B SELECT last_insert_id(); outputs 3??

この場合、人物 A の last_insert_id() は 1 カウント遅れています。これが本当なら、3 番目の方法は使えません。


間違っている可能性がある場合は、出力を修正してください。

4

2 に答える 2