Ce face VALUES()
Când un INSERT găsește deja un rând cu aceeași cheie, ON DUPLICATE KEY UPDATE modifică rândul existent. În această parte, VALUES(coloana) înseamnă valoarea pe care INSERT-ul încerca s-o adauge. În afara acestei clauze, funcția returnează NULL.
Funcția este depreciată și afișează avertisment. Varianta nouă este un alias pentru rândul inserat: INSERT INTO stoc VALUES (...) AS nou ON DUPLICATE KEY UPDATE cantitate = cantitate + nou.cantitate.
Parametri
| Parametru | Descriere |
|---|---|
coloana |
Coloana din lista INSERT. |
Ce returnează
Valoarea din INSERT pentru acea coloană.
Exemple
Exemplul 1: Adunarea stocului la produsele existente (cu avertisment)
CREATE TABLE stoc (produs VARCHAR(20) PRIMARY KEY, cantitate INT);
INSERT INTO stoc VALUES ('Laptop', 4), ('Mouse', 25);
INSERT INTO stoc VALUES ('Mouse', 10), ('Birou', 2)
ON DUPLICATE KEY UPDATE cantitate = cantitate + VALUES(cantitate);
SELECT * FROM stoc ORDER BY produs;
Rezultat
Warning (Code 1287): 'VALUES function' is deprecated and will be removed in a future release. Please use an alias (INSERT INTO ... VALUES (...) AS alias) and replace VALUES(col) in the ON DUPLICATE KEY UPDATE clause with alias.col instead
+--------+-----------+
| produs | cantitate |
+--------+-----------+
| Birou | 2 |
| Laptop | 4 |
| Mouse | 35 |
+--------+-----------+
Exemplul 2: Varianta nouă, cu alias de rând
CREATE TABLE stoc (produs VARCHAR(20) PRIMARY KEY, cantitate INT);
INSERT INTO stoc VALUES ('Laptop', 4), ('Mouse', 25);
INSERT INTO stoc VALUES ('Mouse', 10), ('Birou', 2) AS nou
ON DUPLICATE KEY UPDATE cantitate = stoc.cantitate + nou.cantitate;
SELECT * FROM stoc ORDER BY produs;
Rezultat
+--------+-----------+
| produs | cantitate |
+--------+-----------+
| Birou | 2 |
| Laptop | 4 |
| Mouse | 35 |
+--------+-----------+
Greșeli frecvente
- Scrii cod nou cu
VALUES(coloana). Va fi eliminată; folosește aliasul de rândAS noușinou.coloana. - Folosești
VALUES()înSELECT. În afara luiON DUPLICATE KEY UPDATE, returneazăNULL.
Comenzi înrudite
INSERT INTO: Adaugă unul sau mai multe rânduri noi într-un tabel.UPDATE: Modifică valorile din rândurile existente ale unui tabel.ROW_COUNT(): Câte rânduri a modificat instrucțiunea anterioară (INSERT, UPDATE, DELETE).