2013-02-12 9 views
5

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

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

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

通知、私はTomcatサーバーの接続プールを使用してmySqlデータベースにアクセスしています。

編集:私はテーブルAに自動インクリメント値を使用してリンクする必要がある行をテーブルBに挿入する必要があるよりも、自動増分でテーブルAに行を挿入する必要があります。

+0

詳細を記入して回答してください。 でも、KeyHolderを使用することができます。 – psi

答えて

10
SELECT max(employeeid) FROM Employee; 

社員が自動インクリメント列であるため、上記のクエリは、従業員テーブルの最後の挿入されたレコードの社員の値を返します。これはOKと思われますが、2つのスレッドが同時に挿入操作を実行しているとします。最後に挿入されたレコードのIDが間違っている可能性があります。 MySQLは、最後に挿入されたレコードの自動インクリメントカラムの値を返す関数を提供しています。

SELECT LAST_INSERT_ID(); 

LAST_INSERT_ID()は常に特定の接続であり、これは挿入操作は、異なる接続から同時に行っても、それは常に現在の接続特定の操作の値を返すことを意味します。最初にEmployeeテーブルにレコードを挿入し、上記のクエリを実行してID値を取得し、これを使用して2番目のテーブルに挿入する必要があります。

+0

ありがとう.. LAST_INSERT_IDが機能するためには、トランザクションsetAutocommit(false)を使用する必要がありますか?または同じ接続を使用している限り正常に動作するはずです。 – user836026

+0

@ user836026を安全にするには、トランザクション内であってもINSERTの直後にもこのSETを呼び出すことができます。次にトランザクションの言及はMAX内で呼び出された場合に望ましい結果をもたらす可能性が高いMAXケースそれにもかかわらず、LAST_INSERT_IDが優先されます。 – MediaVince

1

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

ここに詳しい情報:文脈https://dba.stackexchange.com/questions/21181/is-mysqls-last-insert-id-function-guaranteed-to-be-correct

(私はmysql.comにリンクだろうが、それは私のためにダウンし、現在'S)

+0

'LAST_INSERT_ID'はグローバルコールですか?特定のテーブルに 'LAST_INSERT_ID'はありませんか? – user961627

+2

@ user961627現在のセッション内で最後に挿入されたテーブルを常に知っておくべきです。 – scones

2

LAST_INSERT_ID()仕事、それが取引にまたは保存された定義されたユーザ内にある必要がありますプロシージャーまたはユーザー定義関数を使用します。

+0

ありがと... Javaで、私がfalseに設定した自動コミットを使用し、変更をコミットする場合、それは仕事を行う必要がありますか? – user836026

2

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

たとえば、あなたは以下のそれぞれに対して同じ(オープン)接続受け取ることを想定します。

INSERT IGNORE ... some-new-id >>>LAST_INSERT_IDリターンを100

INSERT IGNORE ... some-existing-id >>>LAST_INSERT_IDまだ100(前回の演算の結果)

を返します。 LAST_INSERT_IDを呼び出す前に、INSERTの操作で実際に行が挿入されているかどうかを確認することは常に良い方法です。

関連する問題