web-dev-qa-db-fra.com

Mise à jour de plusieurs lignes avec des valeurs différentes dans une seule requête

J'essaie de comprendre comment METTRE À JOUR plusieurs lignes avec des valeurs différentes et je ne comprends tout simplement pas. La solution est partout mais elle me semble difficile à comprendre.

Par exemple, deux mises à jour en 1 requête:

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

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

Je ne comprends pas ce que CASE WHEN .. THEN ... END fonctionne et comment l'utiliser.

Je me demande si quelqu'un pourrait m'aider à ce sujet.

12
user3162468
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);

Personnellement, en utilisant CASE WHEN THEN END semble maladroit.

Vous pouvez coder cela en utilisant la fonction 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);

Essayez-le !!!

CAVEAT : CASE WHEN THEN END n'est pratique que lorsqu'il s'agit de plusieurs valeurs (plus de 2)

11
RolandoMySQLDBA

INSERT ... ON DUPLICATE KEY UPDATE

Vous devrez écrire des conditions très compliquées si vous souhaitez mettre à jour plus de deux lignes. Dans ce cas, vous pouvez utiliser INSERT ... ON DUPLICATE KEY UPDATE approche.

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);
4
Yaroslav