1

そこで、MySQL データベースに行を挿入する関数を設計しています。テーブルには、自動インクリメントが有効になっている主キーがあります。したがって、この列の値は挿入しません。ただし、PK はテーブル全体で唯一の一意の列です。挿入したばかりの行を取得するにはどうすればよいですか?

関数のトラフィックが少ない場合は問題はありませんが、その負荷がますます重くなると、潜在的なバグが発生する可能性があります。たとえば、行を挿入し、DB の AI 値が 1 で、フェッチ関数が開始される前に「最後に挿入された行」を要求するために、別の行が AI 値 2 で挿入されます。ここで、挿入 1 のフェッチ関数が実行されると、行 2 がフェッチされます。このバグが実際に存在できるようにするには、時間のギャップを非常に小さくする必要があることはわかっていますが、一意の列として PK のみを持つテーブルを維持しながら、正しい行を取得するより良い方法はありますか? (追加のチェックサム列を実装したくありませんが、それは潜在的な解決策だと思います。)

4

2 に答える 2

1

このphp関数mysqli_insert_id()を読んでください

上記について申し訳ありませんが、私はあなたが php を使用していると愚かにも思いました。MySQL には、ネイティブの LAST_INSERT_ID() 関数もあります。

生成された ID は、接続ごとにサーバーに保持されます。これは、関数によって特定のクライアントに返される値が、そのクライアントによって AUTO_INCREMENT 列に影響を与える最新のステートメントに対して生成された最初の AUTO_INCREMENT 値であることを意味します。この値は、他のクライアントが独自の AUTO_INCREMENT 値を生成したとしても、影響を受けることはありません。この動作により、各クライアントは、他のクライアントのアクティビティを気にせず、ロックやトランザクションを必要とせずに、独自の ID を取得できるようになります。

参照; http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_last-insert-id

于 2013-07-22T21:46:38.183 に答える