2011-01-09 7 views
32

Wenn ich mehrere Datensätze mit einer Schleife einfügen, die eine einzelne Datensatz einfügen führt, ist die letzte zurückgegebene ID zurückgegeben, wie erwartet, die letzte. Aber wenn ich eine mehr Datensätze INSERT-Anweisung tun:MySQL LAST_INSERT_ID() verwendet mit mehreren Datensätzen INSERT-Anweisung

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

sagen Lassen Sie die oben genannten drei die ersten Datensätze in der Tabelle eingefügt sind. Nach der INSERT-Anweisung erwartete ich, dass die letzte INS-ID 3 zurückgibt, aber sie gab 1 zurück. Die erste INS-ID für die fragliche Anweisung.

So kann jemand bitte bestätigen, wenn dies das normale Verhalten von LAST_INSERT_ID() im Kontext mehrerer Datensätze INSERT-Anweisungen ist. Also kann ich meinen Code darauf aufbauen.

+0

Hat Ihre Tabelle eine Auto-IncrementID? –

+4

die zweiten beiden einfügen IDs sind leicht zu berechnen. fügen Sie einfach einen für jeden Datensatz nach dem ersten hinzu. – dqhendricks

+2

@dqhendricks sind Sie sicher, dass die IDs richtig sind? Soweit mir bekannt ist, sperren Inserts mit innodb einen bestimmten Satz von IDs nicht, und ein anderer Prozess fügt möglicherweise einen Eintrag dazwischen ein, obwohl ich mir darüber für mehrere Werte in 'INSERT ... VALUES ...' nicht sicher bin –

Antwort

37

Ja. Dieses Verhalten von last_insert_id() ist documented in the MySQL docs:

Wichtige
Wenn Sie mehrere Zeilen mit einer einzigen INSERT Anweisung einfügen, LAST_INSERT_ID() den Wert für die erste eingefügte Zeile nur dann erzeugt zurückgibt. Der Grund dafür ist, dass es leicht möglich ist, die gleiche INSERT Anweisung gegen einen anderen Server zu reproduzieren.

2

Dieses Verhalten wird auf der man page für MySQL erwähnt. Es ist in den Kommentaren, wird aber nicht in Frage gestellt, also vermute ich, dass es das erwartete Verhalten ist.

+0

FYI: Dieses Verhalten ist im eigentlichen MySQL-Handbuch dokumentiert, nicht nur Benutzerkommentare. Siehe [meine Antwort] (http://stackoverflow.com/questions/4637367/mysql-last-inserts-id-used-with-multiple-records-insert-statement/7959695#7959695) für Details. – Asaph