Il wiki della programmazione - Restituire un ID dopo un insert

Home :: Pagine che puntano a questa :: Login/Register

Restituire un ID dopo un insert

Spesso un programmatore sente l'esigenza di capire quale ID è stato inserito tramite un'operazione di INSERT. Per esempio, se si inseriscono una regione e delle province la prima query sarebbe qualcosa di simile a:

INSERT INTO regioni (nome, descrizione) VALUES ("Veneto", "Bella gente")


A questo punto, volendo inserire le province del Veneto, ma ci si trova di fronte ad un problema:
INSERT INTO province (nome, ID_regione) VALUES ("Venezia", ......

Che ID passare?
La risposta esatta è... dipende dal database.
Alcuni database (quasi tutti) forniscono un modo per recuperare l'ultimo ID inserito. Altri purtroppo no.

Access

MS Access NON fornisce alcuno strumento per il recupero dell'ultimo ID inserito.
Se l'applicazione è progettata per essere utilizzata solo da un utente per volta è possibile recuperare un ID numerico (contatore) impostato in modo che sia progressivo e non casuale tramite la query
SELECT MAX(ID) AS CurrID FROM regioni

Però c'è il problema che se un altro utente inserisce una nuova regione tra l'inserimento della regione e la successiva estrazione dell'ID, l'ID estratto sarà SBAGLIATO!
La soluzione è... cambiare database!

MySQL

In MySQL estrarre l'ultimo ID inserito è semplicissimo:
SELECT LAST_INSERT_ID();

utilizzabile anche all'interno della procedura di insert:
INSERT INTO province (nome, ID_regione) VALUES ("Venezia", LAST_INSERT_ID());

Attenzione però a non utilizzarlo più volte in procedure di insert: la seconda volta la funzione restituisce il valore dell'ID dell'ultima provincia inserita!

MS SQL server

Microsoft SQL server a sua volta offre la funzione IDENT_CURRENT, alla quale è possibile passare il nome della tabella per ottenere l'ultimo ID.
SELECT IDENT_CURRENT('apparato')

è molto semplice, ed è possibile utilizzarlo (al contrario di LAST_INSERT_ID di MySQL) più volte, in quanto il suo scope (àmbito) è solo la tabella passata come parametro.

Oracle

In Oracle gli ID sono conteggiati da elementi che si chiamano sequence, che possono essere incrementati da un trigger.
In compenso farsi restituire un ID da un sequence è molto semplice:
SELECT sequence.CURRVAL FROM dual

Inoltre sequence.NEXTVAL restituisce il prossimo valore che sarà inserito.

Non ci sono commenti. [Aggiungere un commento]

Valid XHTML 1.0 Strict :: Valid CSS :: Realizzato con Wikka Wakka Wiki 1.1.6.3
Page was generated in 0.0297 seconds