Ottenere lโID dellโultimo record inserito in una tabella, dopo unโoperazione di inserimento in un database, รจ una necessitร comune nello sviluppo delle applicazioni. Questo dato (lโID), infatti, รจ spesso utilizzato per operazioni successive, come lโassociazione di dati correlati presenti in altre tabelle del database o altre operazioni che richiedono lโutilizzo di questo identificativo univoco. In questo articolo, esploreremo diverse tecniche e sintassi per recuperare lโID dellโultimo record inserito nei piรน popolari DBMS, cioรจ MySQL/MariaDB, PostgreSQL, SQL Server e Oracle.
Indice
Cosโรจ lโID e come funziona?
Il termine ID significa โidentificatoreโ o โidentificativoโ. Nella maggior parte dei sistemi di gestione di database, lโID รจ un valore di tipo numerico autoincrementale assegnato a ogni record allโinterno di una tabella per che consente di identificarlo in modo univoco.
LโID viene spesso utilizzato come chiave primaria della tabella, il che significa che รจ un valore univoco (non puรฒ essere duplicato) che identifica ogni riga nella tabella.
Quando viene inserito un nuovo record nella tabella, il valore dellโID viene assegnato automaticamente e in modo incrementale dal sistema di gestione del database, a meno che non sia specificato diversamente.
Casi dโuso
Il valore ID, spesso, รจ utilizzato per stabilire relazioni tra le diverse tabelle del database.
Per meglio capire si supponga di dover sviluppare un sito di e-commerce nel cui database saranno presenti una tabella โutentiโ con i dati degli utenti registrati ed una tabella โordiniโ che tiene traccia degli ordini effettuati degli utenti.
Nella tabella โordiniโ sarร presente una colonna โuser_idโ che farร riferimento allโID dellโutente nella tabella โutentiโ. In questo modo, รจ possibile associare ogni ordine ad un utente specifico utilizzando lโID come riferimento.
In sintesi, lโID รจ un elemento fondamentale nei database relazionali per identificare in modo univoco i record allโinterno delle tabelle e gestire in modo corretto le relazioni tra i dati, esattamente come abbiamo visto nellโesempio del sito di e-commerce.
Conoscere il valore dellโID appena generato, quindi, puรฒ essere importante per garantire lโintegritร referenziale dei dati nel database ed anche per altre operazioni che, a livello applicativo, richiedono quel dato.
Ottenere lโultimo ID inserito in MySQL/MariaDB
MySQL e MariaDB sono due dei database relazionali piรน utilizzati al mondo e condividono molte caratteristiche, inclusa la capacitร di ottenere lโID dellโultimo record inserito. Vediamo come farlo con alcune tecniche differenti.
Utilizzo di LAST_INSERT_ID()
La funzione LAST_INSERT_ID() restituisce lโultimo valore generato per una colonna AUTO_INCREMENT. Questa funzione รจ specifica della connessione e restituisce il valore solo se รจ stata eseguita unโoperazione di inserimento. Se non ci sono state operazioni di inserimento o se lโultima operazione di inserimento รจ fallita, la funzione restituirร zero.
INSERT INTO users (username, email) VALUES ('mario_rossi', 'mario.rossi@esempio.com');
SELECT LAST_INSERT_ID();
Vediamo come gestire la cosa allโinterno di un applicativo PHP:
// Connessione al database
$conn = new mysqli("localhost", "username", "password", "database");
// Query di inserimento
$sql = "INSERT INTO users (username, email) VALUES ('mario_rossi', 'mario.rossi@esempio.com')";
$conn->query($sql);
// Recupero dell'ID dell'ultimo record inserito
$last_insert_id = $conn->insert_id;
// stampo a video
echo "ID dell'ultimo record inserito: " . $last_insert_id;
// Chiusura della connessione al database
$conn->close();
Utilizzo di RETURNING (MariaBD 10.5 o sup.)
MariaDB 10.5 ha introdotto la clausola RETURNING che permette di recuperare i valori delle colonne specificate dopo unโoperazione di inserimento. Questa funzionalitร รจ particolarmente utile quando si desidera ottenere lโID dellโultimo record inserito senza dover eseguire una query di selezione separata.
INSERT INTO users (username, email) VALUES ('mario_rossi', 'mario.rossi@esempio.com') RETURNING id;
La clausola RETURNING id, specifica al termine della query, indica al DBMS che vogliamo ci venga restituito il valore della colonna id dellโultimo record inserito.
Vediamo un esempio di implementazione in PHP:
// Connessione al database
$conn = new mysqli("localhost", "username", "password", "database");
// Query di inserimento
$sql = "INSERT INTO users (username, email) VALUES ('mario_rossi', 'mario.rossi@esempio.com') RETURNING id;";
$conn->query($sql);
$result = $conn->query($sql);
if ($result === false) {
echo "Errore nell'esecuzione della query: " . $conn->error;
} else {
// Recupero dell'ID dell'ultimo record inserito
$row = $result->fetch_assoc();
$last_insert_id = $row['id'];
echo "ID dell'ultimo record inserito: " . $last_insert_id;
}
// Chiusura della connessione al database
$conn->close();
Ottenere lโultimo ID inserito in PostgreSQL
Vediamo come ottenere lโID dellโultimo record inserito in PostgreSQL.
In PostgreSQL, la clausola RETURNING ci consente di recuperare i valori specificati dopo unโoperazione di inserimento, inclusi gli ID delle nuove righe inserite. Questa รจ una modalitร elegante per ottenere direttamente lโID del record appena creato.
INSERT INTO users (username, email) VALUES ('mario_rossi', 'mario.rossi@esempio.com') RETURNING id;
Ecco un esempio di implementazione in PHP:
// Connessione al database
$conn = pg_connect("host=localhost dbname=database user=username password=password");
// Query di inserimento
$sql = "INSERT INTO users (username, email) VALUES ('mario_rossi', 'mario.rossi@esempio.com') RETURNING id";
$result = pg_query($conn, $sql);
// Recupero dell'ID dell'ultimo record inserito
$row = pg_fetch_assoc($result);
$last_insert_id = $row['id'];
// stampo a video
echo "ID dell'ultimo record inserito: " . $last_insert_id;
// Chiusura della connessione al database
$conn->close();
Ottenere lโultimo ID inserito in SQL Server
SQL Server รจ un altro popolare sistema di gestione di database relazionali. Vediamo quali sono le tecniche per ottenere lโID dellโultimo record inserito in SQL Server.
Utilizzo di SCOPE_IDENTITY()
In SQL Server, la funzione SCOPE_IDENTITY() restituisce lโultimo valore generato per una colonna IDENTITY nella stessa sessione e ambito. Questa funzione รจ particolarmente utile quando si desidera ottenere lโID dellโultimo record inserito allโinterno del contesto corrente.
INSERT INTO users (username, email) VALUES ('mario_rossi', 'mario.rossi@esempio.com');
SELECT SCOPE_IDENTITY();
using System.Data.SqlClient;
// Connessione al database
string connectionString = "Data Source=localhost;Initial Catalog=database;User Id=username;Password=password;";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
// Query di inserimento
string sql = "INSERT INTO users (username, email) VALUES ('mario_rossi', 'mario.rossi@esempio.com')";
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.ExecuteNonQuery();
}
// Recupero dell'ID dell'ultimo record inserito
sql = "SELECT SCOPE_IDENTITY()";
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
object result = cmd.ExecuteScalar();
if (result != null)
{
int last_insert_id = Convert.ToInt32(result);
}
}
}
Utilizzo di OUTPUT
Unโaltra opzione in SQL Server รจ utilizzare la clausola OUTPUT con lโistruzione INSERT per recuperare i valori delle colonne specificate. Questo ci permette di ottenere direttamente lโID dellโultimo record inserito senza dover eseguire una query di selezione separata.
INSERT INTO users (username, email) OUTPUT INSERTED.id VALUES ('mario_rossi', 'mario.rossi@esempio.com');
using System.Data.SqlClient;
// Connessione al database
string connectionString = "Data Source=localhost;Initial Catalog=database;User Id=username;Password=password;";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
// Query di inserimento con OUTPUT
string sql = "INSERT INTO users (username, email) OUTPUT INSERTED.id VALUES ('mario_rossi', 'mario.rossi@esempio.com')";
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
object result = cmd.ExecuteScalar();
if (result != null)
{
int last_insert_id = Convert.ToInt32(result);
}
}
}
Ottenere lโultimo ID inserito in Oracle
In Oracle, la clausola RETURNING INTO consente di recuperare i valori specificati dopo unโoperazione di inserimento, inclusi gli ID delle nuove righe inserite. Questa รจ una modalitร elegante per ottenere direttamente lโID del record appena creato.
-- Creazione della sequenza (se non esiste)
CREATE SEQUENCE users_seq;
-- Inserimento di un nuovo utente
INSERT INTO users (id, username, email) VALUES (users_seq.NEXTVAL, 'mario_rossi', 'mario.rossi@esempio.com') RETURNING id INTO :last_insert_id;
Vediamo una implementazione in C#
using System;
using Oracle.ManagedDataAccess.Client;
// Connessione al database
string connectionString = "User Id=username;Password=password;Data Source=//localhost:1521/XE;";
using (OracleConnection conn = new OracleConnection(connectionString))
{
conn.Open();
// Query di inserimento con RETURNING INTO
string sql = "INSERT INTO users (id, username, email) VALUES (users_seq.NEXTVAL, 'mario_rossi', 'mario.rossi@esempio.com') RETURNING id INTO :last_insert_id";
using (OracleCommand cmd = new OracleCommand(sql, conn))
{
// Aggiungere il parametro di output per il recupero dell'ID dell'ultimo record inserito
OracleParameter param = new OracleParameter("last_insert_id", OracleDbType.Decimal);
param.Direction = System.Data.ParameterDirection.Output;
cmd.Parameters.Add(param);
cmd.ExecuteNonQuery();
// Recupero dell'ID dell'ultimo record inserito
decimal last_insert_id = (decimal)cmd.Parameters["last_insert_id"].Value;
}
}
Conclusioni
Ottenere lโID dellโultimo record inserito รจ unโoperazione cruciale nello sviluppo di molte applicazioni. Conoscere le diverse sintassi e funzioni disponibili nei database piรน comuni โ come MySQL, PostgreSQL, SQL Server e Oracle โ ci consente di affrontare questa necessitร in modo efficiente a prescindere dalle specificitร dei diversi DBMS.