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 deLAST_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ăcutINSERT(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.