2011-01-09 14 views
32

Se inserisco più record con un ciclo che esegue un singolo inserimento di record, l'ultimo ID di inserimento restituito è, come previsto, l'ultimo. Ma se faccio un multiplo dichiarazione record inserto:MySQL LAST_INSERT_ID() utilizzato con più record INSERT istruzione

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

Diciamo che il tre di cui sopra sono i primi record inseriti nella tabella. Dopo l'istruzione di inserimento mi aspettavo che l'ultimo ID di inserimento restituisse 3, ma restituiva 1. Il primo ID di inserimento per l'istruzione in questione.

Quindi qualcuno può confermare se questo è il comportamento normale di LAST_INSERT_ID() nel contesto di più istruzioni INSERT di record. Quindi posso basare il mio codice su di esso.

+0

La tabella ha un incremento automatico? –

+4

i secondi due ID di inserimento sono facilmente calcolabili. aggiungine uno per ogni record dopo il primo. – dqhendricks

+2

@dqhendricks sei sicuro che gli ID avranno ragione? per quanto ne so, gli inserti con innodb non bloccano un certo insieme di ID e un altro processo potrebbe inserire una voce in mezzo, anche se non ne sono sicuro per più valori in "INSERT ... VALUES ..." –

risposta

37

Sì. Questo comportamento di last_insert_id() è documented in the MySQL docs:

Importante
Se si inserisce più righe utilizzando una singola INSERT dichiarazione, LAST_INSERT_ID() restituisce il valore generato per solo la prima riga inserita. La ragione di ciò è di rendere possibile riprodurre facilmente la stessa dichiarazione INSERT rispetto ad altri server.

2

Questo comportamento è menzionato su man page per MySQL. È nei commenti ma non è contestato, quindi immagino che sia il comportamento previsto.

+0

Nota: questo comportamento è documentato nell'attuale manuale MySQL, non solo nei commenti degli utenti. Vedi [la mia risposta] (http://stackoverflow.com/questions/4637367/mysql-last-insert-id-used-with-multiple-records-insert-statement/7959695#7959695) per i dettagli. – Asaph