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.
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!
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!
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.
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]