back to top

Come ottenere lโ€™ID dellโ€™ultimo record inserito in MySQL, PostgreSQL, SQL Server e Oracle?

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.

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.

Pubblicitร 

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.

Altri contenuti interessanti

Pubblicitร 

Potrebbero interessarti queste guide

Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).

Leggi anche...

Database completo regioni, province e comuni italiani (in formato SQL)

Quando si sviluppa un sito web o un'applicazione in...

File CSV: cosa sono, come si aprono e come crearli

In questo articolo cercheremo di capire cos'รจ il formato...

Confrontare due tabelle e trovare i record senza corrispondenza

all'interno di un database relazionale puรฒ essere utile poter...

Eseguire comandi SQL online con SQL Fiddle

Sรฌ. E' possibile testare codice SQL senza aver installato...

SQL: Calcolare la media dei valori di piรน campi

Attraverso una semplice query SQL รจ possibile calcolare dinamicamente...

MySQL: modificare il valore di AUTO_INCREMENT

MySQL รจ uno dei sistemi di gestione di basi...
Pubblicitร