12

私が使用しているので、挿入された行のIDを取得して、2つのテーブル間の共通フィールドとしてAUTO_INCREMENT使用して別のテーブルを更新できるようにします。ID

LAST_INSERT_ID私はそれが最後になることを理解しましたID。しかし、私の懸念は、データベースが多くのユーザーによって同時にアクセスされていることです。したがって、別のプロセスがテーブルにアクセスし、同時に新しい行を挿入した可能性があります。

使用されている接続LAST_INSERT_IDに関係なく、最後のIDのみを返しますか、それとも使用している接続の最後のIDのみを返しますか?

Tomcatサーバーの接続プールを使用してMySQLデータベースにアクセスしていることに注意してください。

要約すると、値を使用してテーブルAにリンクする必要があるテーブルBに行を挿入する必要があるよりも、自動インクリメントを使用してテーブルAに行を挿入する必要がありAUTO_INCREMENTます。

4

4 に答える 4

18
SELECT max(employeeid) FROM Employee;

上記のクエリは、自動インクリメント列であるemployeeidため、Employeeテーブルに最後に挿入されたレコードの値を返します。employeeidこれは問題ないようですが、2つのスレッドが同時に挿入操作を実行しているとすると、最後に挿入されたレコードのIDが間違っている可能性があります。

心配しないでください。MySQLには、最後に挿入されたレコードの自動インクリメント列の値を返す関数が用意されています。

SELECT LAST_INSERT_ID();

LAST_INSERT_ID()は常に接続固有です。これは、挿入操作が異なる接続から同時に実行された場合でも、常に現在の接続固有の操作の値を返すことを意味します。

したがって、最初にEmployeeテーブルにレコードを挿入し、上記のクエリを実行してid値を取得し、これを使用して2番目のテーブルに挿入する必要があります。

于 2013-02-12T08:01:41.093 に答える
2

LAST_INSERT_ID()コンテキストで動作する 場合は、トランザクション内、またはユーザー定義のストアドプロシージャまたはユーザー定義の関数内にある必要があります。

于 2013-02-12T07:53:36.037 に答える
2

LAST_INSERT_ID接続固有です。それは本当ですが、接続プールを使用する場合は注意が必要です。これは、ループ内で連続するINSERT IGNOREステートメントを実行し、プールが各反復で同じ接続を提供する場合に問題になる可能性があります。

例えば; 以下のそれぞれについて、同じ(オープン)接続を受信するとします。

INSERT IGNORE ... some-new-id >>>LAST_INSERT_ID戻ります100

INSERT IGNORE ... some-existing-id >>>LAST_INSERT_IDそれでも戻ります100(前の操作の結果)

INSERTを呼び出す前に、操作で実際に行が挿入されているかどうかを確認することをお勧めしLAST_INSERT_IDます。

于 2013-04-30T19:45:02.170 に答える
1

LAST_INSERT_ID現在のセッションの最後の挿入IDを返します。現在の接続で複数のエントリを挿入しない限り、それは有効です。

詳細はこちら:https ://dba.stackexchange.com/questions/21181/is-mysqls-last-insert-id-function-guaranteed-to-be-correct

(私はmysql.comにリンクしますが、現在私にとってはダウンしています)

于 2013-02-12T07:51:01.997 に答える