LAST_INSERT_ID() în MySQL

Returnează ID-ul AUTO_INCREMENT generat de ultimul INSERT din conexiunea curentă.

Sintaxă
LAST_INSERT_ID()
LAST_INSERT_ID(expresie)

Ce face LAST_INSERT_ID()

După un INSERT într-un tabel cu coloană AUTO_INCREMENT, LAST_INSERT_ID() dă valoarea generată. Valoarea este păstrată separat pentru fiecare conexiune, așa că inserările făcute în același timp de alți utilizatori nu o afectează.

Dacă un singur INSERT adaugă mai multe rânduri, funcția returnează ID-ul primului rând inserat. Dacă dai o valoare explicită coloanei (nu NULL sau 0), valoarea funcției nu se schimbă.

Cu un argument, LAST_INSERT_ID(expresie) returnează expresia și o ține minte pentru următorul apel fără argument. Așa se poate face un contor (secvență) într-un tabel.

Parametri

Parametru Descriere
expresie Opțional. Valoarea care va fi returnată de următorul LAST_INSERT_ID().

Ce returnează

Un număr BIGINT UNSIGNED; 0 dacă în conexiune nu s-a generat încă niciun ID.

Exemple

Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.

CREATE TABLE produse (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nume VARCHAR(30),
  pret INT,
  stoc INT
);

INSERT INTO produse (nume, pret, stoc) VALUES
  ('Laptop', 3500, 4),
  ('Mouse', 80, 25),
  ('Birou', 900, 0),
  ('Scaun', 650, 7),
  ('Monitor', 1200, 3);

Exemplul 1: ID-ul clientului nou, folosit în comanda lui

CREATE TABLE clienti (id INT AUTO_INCREMENT PRIMARY KEY, nume VARCHAR(30));
CREATE TABLE comenzi (id INT AUTO_INCREMENT PRIMARY KEY, client_id INT, total INT);
INSERT INTO clienti (nume) VALUES ('Ana Pop'), ('Dan Ionescu');

INSERT INTO clienti (nume) VALUES ('Ioana Marin');
INSERT INTO comenzi (client_id, total) VALUES (LAST_INSERT_ID(), 250);

SELECT * FROM comenzi;

Rezultat

+----+-----------+-------+
| id | client_id | total |
+----+-----------+-------+
|  1 |         3 |   250 |
+----+-----------+-------+

Exemplul 2: La mai multe rânduri: ID-ul primului

INSERT INTO produse (nume, pret, stoc) VALUES
  ('Tastatură', 150, 10),
  ('Căști', 200, 6),
  ('Boxe', 300, 2);

SELECT LAST_INSERT_ID() AS primul_id_nou, MAX(id) AS ultimul_id FROM produse;

Rezultat

+---------------+------------+
| primul_id_nou | ultimul_id |
+---------------+------------+
|             6 |          8 |
+---------------+------------+

Exemplul 3: Contor cu LAST_INSERT_ID(expresie)

Numerotarea facturilor: UPDATE mărește contorul și îl ține minte, iar SELECT îl citește, fără risc ca altă conexiune să primească același număr.

CREATE TABLE contor_facturi (ultimul INT NOT NULL);
INSERT INTO contor_facturi VALUES (1000);

UPDATE contor_facturi SET ultimul = LAST_INSERT_ID(ultimul + 1);
SELECT LAST_INSERT_ID() AS numar_factura;

Rezultat

+---------------+
| numar_factura |
+---------------+
|          1001 |
+---------------+

Greșeli frecvente

  • Folosești SELECT MAX(id) FROM tabel în loc de LAST_INSERT_ID(). Dacă alt utilizator inserează în același timp, primești ID-ul lui.
  • Apelezi LAST_INSERT_ID() dintr-o altă conexiune decât cea care a făcut INSERT (de exemplu, din alt obiect de conexiune în aplicație). Fiecare conexiune are valoarea ei.

Comenzi înrudite

  • INSERT INTO: Adaugă unul sau mai multe rânduri noi într-un tabel.
  • ROW_COUNT(): Câte rânduri a modificat instrucțiunea anterioară (INSERT, UPDATE, DELETE).
  • UUID(): Generează un identificator unic universal (UUID versiunea 1), un text de 36 de caractere.