Actualización de varias filas con diferentes valores en una consulta


12

Estoy tratando de entender cómo ACTUALIZAR varias filas con diferentes valores y simplemente no lo entiendo. La solución está en todas partes, pero para mí parece difícil de entender.

Por ejemplo, dos actualizaciones en 1 consulta:

UPDATE mytable SET fruit='orange', drink='water', food='pizza' WHERE id=1;

UPDATE mytable SET fruit='strawberry', drink='wine', food='fish' WHERE id=2;

No entiendo cuál es el CASO CUANDO ... ENTONCES ... FIN funciona y cómo usarlo.

Me pregunto si alguien podría ayudarme en esto.

Respuestas:


11
UPDATE mytable SET
    fruit = CASE WHEN id=1 THEN 'orange' ELSE 'strawberry' END,
    drink = CASE WHEN id=1 THEN 'water'  ELSE 'wine'       END,
    food  = CASE WHEN id=1 THEN 'pizza'  ELSE 'fish'       END
WHERE id IN (1,2);

Personalmente, el uso se CASE WHEN THEN ENDve torpe.

Puede codificar esto usando la función IF .

UPDATE mytable SET
    fruit = IF(id=1,'orange','strawberry'),
    drink = IF(id=1,'water','wine'),
    food  = IF(id=1,'pizza','fish')
WHERE id IN (1,2);

Darle una oportunidad !!!

PRUEBA: CASE WHEN THEN ENDsolo es útil cuando se trata de valores múltiples (más de 2)


Bien, no sabía sobre esta función IF. ¿Puede explicar: = IF (id = 1, ¿por qué necesita esto?
user3162468

44
¿Puedo usar esto para actualizar alrededor de 100k registros en sinle query?
AMB

4

INSERT ... ON DUPLICATE KEY UPDATE

Necesitará escribir condiciones muy complicadas si desea actualizar más de dos filas. En tal caso, puede utilizar el INSERT ... ON DUPLICATE KEY UPDATEenfoque.

INSERT into `mytable` (id, fruit, drink, food)
VALUES
    (1, 'orange', 'water', 'pizza'),
    (2, 'strawberry', 'wine', 'fish'),
    (3, 'peach', 'jiuce', 'cake')
ON DUPLICATE KEY UPDATE
    fruit = VALUES(fruit), 
    drink = VALUES(drink), 
    food = VALUES(food);

3
Tenga en cuenta que esto aumenta el valor de incremento automático para la tabla, si está utilizando el incremento automático. Para tablas de alto rendimiento que pueden ser indeseables. Más información stackoverflow.com/a/23517191/2560641
Juliano
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.