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

12

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.

user3162468
la source

Réponses:

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

Personnellement, l'utilisation CASE WHEN THEN ENDsemble maladroite.

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

Essaie !!!

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

RolandoMySQLDBA
la source
Bien, je ne connaissais pas cette fonction IF. Pouvez-vous simplement expliquer: = IF (id = 1, pourquoi en avez-vous besoin?
user3162468
4
puis-je l'utiliser pour mettre à jour environ 100 000 enregistrements dans une requête unique?
AMB
4

INSERT ... ON DUPLICATE KEY UPDATE

Vous devrez écrire des conditions très compliquées si vous souhaitez mettre à jour plus de deux lignes. Dans un tel cas, vous pouvez utiliser l' INSERT ... ON DUPLICATE KEY UPDATEapproche.

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);
Iaroslav
la source
3
Notez que cela augmente la valeur d'auto-incrémentation de la table, si vous utilisez l'auto-incrémentation. Pour les tables à haut débit qui pourraient être indésirables. Plus d'infos stackoverflow.com/a/23517191/2560641
Juliano