2011-01-09 19 views
32

単一のレコード挿入を実行するループで複数のレコードを挿入すると、最後に挿入された挿入IDは最後に挿入されたものになります。私は複数のレコードを行う場合でも、文を挿入します。複数のレコードで使用されるMySQL LAST_INSERT_ID()INSERTステートメント

INSERT INTO people (name,age) 
VALUES ('William',25), ('Bart',15), ('Mary',12); 

はのは、上記の3つのテーブルに挿入最初の記録であるとしましょう。挿入ステートメントの後、私は最後の挿入IDが3を返すと予想しましたが、1を返しました。問題のステートメントの最初の挿入ID。

これは、複数レコードのINSERTステートメントのコンテキストで、これが通常の動作(LAST_INSERT_ID())であることを確認してください。だから私は自分のコードを基にすることができます。

+0

テーブルに自動インクリメントIDがありますか? –

+4

2番目の2つの挿入IDは簡単に計算可能です。最初のレコードの後に​​レコードごとに1つずつ追加してください。 – dqhendricks

+2

@dqhendricksあなたはIDが正しいと確信していますか?私が知っている限り、innodbの挿入は特定のIDのセットをロックせず、別のプロセスがその間にエントリを挿入するかもしれませんが、INSERT ... VALUES ...の複数の値についてこれについてはわかりません –

答えて

37

はい。 last_insert_id()のこの動作はdocumented in the MySQL docsです:あなたは、単一のINSERT文を使用して複数の行を挿入した場合

重要
は、LAST_INSERT_ID()のみ最初の挿入された行のために生成された値を返します。これは、他のサーバと同じ文を容易に再現するためです。

2

この動作は、MySQLのman pageに記載されています。それはコメントにありますが、挑戦されていないので、私はそれが予想される行動だと推測しています。

+0

FYI:この動作は、ユーザーのコメントだけでなく、実際のMySQLマニュアルにも書かれています。詳細については、[私の答え](http://stackoverflow.com/questions/4637367/mysql-last-insert-id-used-with-multiple-records-insert-statement/7959695#7959695)を参照してください。 – Asaph

関連する問題