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.

Commenti

Sto caricando i commenti......
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.