VALUES() în MySQL

UUID, IP și diverse MySQL 5.0+ (depreciată din 8.0.20)

În INSERT ... ON DUPLICATE KEY UPDATE, valoarea care s-ar fi inserat; depreciată, folosește un alias de rând.

Sintaxă
INSERT ... ON DUPLICATE KEY UPDATE coloana = VALUES(coloana)

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ând AS nou și nou.coloana.
  • Folosești VALUES() în SELECT. În afara lui ON 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).