not - on duplicate key update mysql ejemplo
Comportamiento MySQL de ON DUPLICATE KEY UPDATE para mĂșltiples campos ĂNICOS (2)
cómo se comporta MySQL ... Se comporta como se esperaba, es decir, se ejecuta la cláusula ON DUPLICATE KEY.
¿Puedo tener una actualización para cualquiera? ... En realidad, solo tiene una cláusula ON DUPLICATE KEY, por lo que necesita poner algo de código para diferenciar la restricción involucrada. Afortunadamente, es posible. Lo único que debe saber, el orden de asignación es importante, y puede asignarlo varias veces. Supongamos que tiene una restricción única en a y b, y desea actualizar c solo si se trata de una singularidad: ... ACTUALIZACIÓN CLAVE c = IF (a = VALORES (a) y b <> VALORES (b), VALORES ( c), c), b = VALORES (b)
pero si cambia el orden de las asignaciones, la segunda condición dentro de si siempre será falsa.
Ver 2
Desde MySQL 4.1.0 en adelante, es posible agregar la instrucción ON DUPLICATE KEY UPDATE
para especificar el comportamiento cuando los valores insertados (con INSERT
o SET
o VALUES
) ya están en la tabla de destino wrt PRIMARY KEY
o en algún campo UNIQUE
. Si el valor de PRIMARY KEY
o algún campo UNIQUE
ya está en la tabla, INSERT
se reemplaza por un UPDATE
.
¿Cómo se comporta
ON DUPLICATE KEY UPDATE
en caso de que haya varios camposUNIQUE
en mi tabla?¿Puedo tener solo una actualización, si alguno de los campos
UNIQUE
coincide?¿Puedo tener una actualización solo si ambos campos
UNIQUE
coinciden simultáneamente?
Considerar
INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
si a y b son campos UNIQUE
, la UPDATE
produce 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.
Ej. Aquí tabla tabla con ID y Nombre campos UNIQUE
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
que viola la singularidad 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 múltiples claves es el siguiente
UPDATE
en ON DUPLICATE KEY UPDATE
se realiza si uno de los campos UNIQUE
es igual al valor que se insertará. Aquí, la 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 cada tecla?
Puede usar la instrucción UPDATE
con la palabra clave LIMIT
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é sucede si deseo una actualización solo si los valores de ambas claves coinciden?
Una solución es ALTER TABLE
y hacer que la PRIMARY KEY
(o la singularidad) funcione 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 claves).