5

の列を持つテーブルがありますAUTO INCREMENT。新しい行を挿入するときに、この列の値を取得する必要があります (新しい行の値が必要です)。私はそれについてたくさん読んで、さまざまな解決策を見つけました.1つは使用することSELECT LAST_INSERT_ID()です. これについては、さまざまなことを聞​​いてきました。これは使えますか、使えませんか?SELECT LAST_INSERT_ID()を呼び出す前に別の接続が新しい行を挿入し、間違った ID を取得するのではないかと心配しています。

要約すると、安全に使用できSELECT LAST_INSERT_ID()ますか? そうでない場合、最後に挿入された ID を安全な方法で取得するにはどうすればよいですか?

4

5 に答える 5

13

ここで言及しているケースについて心配する必要はないと思います。

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

詳細については、参照してください。this

ただし、他の人の意見が異なる場合は、ぜひ読んでみたいと思います。

于 2013-01-09T15:39:41.420 に答える
0

PDOを使用している場合は、PDO::lastInsertId.

mysqlを使用している場合は、mysqli::$insert_id.

はい、安全に使用できますAIこれは次のような投稿です:http: //dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

selectステートメントを直接使用する代わりに、preparedStatement.

また、あなたはロックを使用することができます

于 2013-01-09T16:06:49.103 に答える
0

生成された ID は接続ごとに生成されるため、問題はありません。この投稿で詳しく説明します。

于 2013-01-09T15:40:31.277 に答える
0

はい、公式ドキュメントによると、安全です。

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

出典: MYSQL ドキュメント 12.13。情報機能

于 2013-01-09T15:40:43.150 に答える
0

テーブルの最後の ID を取得することが重要な場合は、書き込み用にテーブルをロックしてから、テーブルを作成SELECT MAX(id) FROM table_nameしてからロック解除できます。

于 2013-01-09T15:39:36.483 に答える