sql >> Base de Datos >  >> RDS >> Mysql

Comportamiento de MySQL de ON ACTUALIZACIÓN DE CLAVE DUPLICADA para múltiples campos ÚNICOS

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).