Considere
INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
Si a y b son UNIQUE
campos, UPDATE
ocurre en a = 1 OR b = 2
. También cuando la condición a = 1 OR b = 2
se cumple con dos o más entradas, la actualización se realiza solo una vez.
Ex aquí tabla de tabla con Id y nombre UNIQUE
campos
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
Si la consulta es
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7);
entonces obtenemos
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
lo que viola la unicidad de Id y Nombre. Ahora con
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
obtenemos
Id Name Value
1 P 7
2 C 7
3 D 29
4 A 6
El comportamiento en varias claves es el siguiente
UPDATE
en ON DUPLICATE KEY UPDATE
se realiza si uno de los UNIQUE
campo es igual al valor que se va a insertar. Aquí, UPDATE
se realiza en Id = 1 OR Name = C
. Es equivalente a
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C;
¿Qué pasa si solo quiero una actualización, para cualquiera de las claves?
Puede usar UPDATE
declaración con LIMIT
palabra clave
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C
LIMIT 1;
que dará
Id Name Value
1 P 7
2 C 3
3 D 29
4 A 6
¿Qué pasa si quiero una actualización solo si los valores de ambas claves coinciden?
Una solución es ALTER TABLE
y crea la PRIMARY KEY
(o singularidad) funcionan en ambos campos.
ALTER TABLE table
DROP PRIMARY KEY,
ADD PRIMARY KEY (Id, Name);
Ahora, en
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
obtenemos
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
ya que no se encuentra ningún duplicado (en ambas llaves).