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.

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', '[email protected]');
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', '[email protected]')";
$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', '[email protected]') 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', '[email protected]')  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', '[email protected]') 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', '[email protected]') 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', '[email protected]');
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', '[email protected]')";
    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', '[email protected]');
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', '[email protected]')";
    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', '[email protected]') 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', '[email protected]') 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.

Pubblicitร 
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

Come è noto, l'attributo AUTO_INCREMENT di MySQL può essere...
Pubblicitร