LAST_INSERT_ID
Sintassi
LAST_INSERT_ID(), LAST_INSERT_ID(espr)
Spiegazione
In MySQL 5.1.12 e successivi, LAST_INSERT_ID() senza argomenti restituisce il primo valore generato automaticamente inserito in una colonna AUTO_INCREMENT in seguito all'istruzione INSERT più recente. Il valore di LAST_INSERT_ID() rimane invariato se nessuna riga viene inserita.
Per esempio, dopo aver inserito una riga che genera un valore AUTO_INCREMENT, è possibile leggere tale valore in questo modo:
MariaDB [test]> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 9 | +------------------+ 1 row in set (0.00 sec) MariaDB [test]>
In MySQL 5.1.11 e precedenti, LAST_INSERT_ID() senza argomenti restituisce il primo valore generato automaticamente se almeno una riga è stata inserita o modificata con successo. Questo significa che il valore restituito potrebbe non essere stato inserito con successo nella tabella. Se nessuna riga è stata inserita, LAST_INSERT_ID() restituisce 0.
Il valore di LAST_INSERT_ID() è coerente con tutte le versioni se tutte le righe sono state inserite o modificate con successo.
Se una tabella contiene una colonna AUTO_INCREMENT e l'istruzione INSERT ... ON DUPLICATE KEY UPDATE modifica (anziché inserire) una riga, il valore di LAST_INSERT_ID() non è significativo prima di MySQL 5.1.12. Per aggirare il problema, si veda http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html.
L'istruzione attualmente in esecuzione non modifica il valore di LAST_INSERT_ID(). Si supponga di generare un valore AUTO_INCREMENT con una istruzione, e poi utilizzare LAST_INSERT_ID() in una INSERT multiriga che inserisce dati in una tabella che ha la sua colonna AUTO_INCREMENT. Il valore di LAST_INSERT_ID() resta invariato durante l'esecuzione della seconda istruzione; il suo valore, dalla seconda riga in poi, non viene influenzato dalle righe precedenti. Tuttavia, se si combinano chiamate a LAST_INSERT_ID() e LAST_INSERT_ID(espr), l'effetto non è prevedibile.
Se l'istruzione precedente restituisce un errore, il valore di LAST_INSERT_ID() è indefinito. Nelle tabelle transazionali, se un'istruzione viene annullata a causa di un errore, il valore di LAST_INSERT_ID() viene lasciato indefinito. Nel caso di un ROLLBACK manuale, il valore LAST_INSERT_ID() non viene ripristinato; esso rimane quello che era al momento del ROLLBACK.
Nel corpo delle Stored Routine (procedure o funzioni) e dei Trigger, il valore di LAST_INSERT_ID() cambia esattamente come fa nelle istruzioni fuori dal corpo di questi oggetti. L'effetto di una Stored Routine o Trigger sul valore di una chiamata a LAST_INSERT_ID() che avviene in seguito, dipende dai seguenti fattori:
- Se una Stored Procedure esegue istruzioni che modificano il valore di LAST_INSERT_ID(), le istruzioni che seguono la chiamata alla routine vedranno il valore modificato.
- Se una Stored Function o un Trigger modificano il valore, questo viene ripristinato al termine delle funzione o del Trigger, perciò le istruzioni seguenti non vedranno il valore modificato.