Aktualizowanie wielu wierszy o różnych wartościach w jednym zapytaniu

12

Próbuję zrozumieć, jak zaktualizować wiele wierszy o różnych wartościach i po prostu tego nie rozumiem. Rozwiązanie jest wszędzie, ale dla mnie wydaje się trudne do zrozumienia.

Na przykład dwie aktualizacje w 1 zapytaniu:

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

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

Nie rozumiem, co PRZYPADEK KIEDY ... NASTĘPNIE ... KONIEC działa i jak go używać.

Zastanawiam się, czy ktoś mógłby mi w tym pomóc.

użytkownik3162468
źródło

Odpowiedzi:

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

Osobiście używanie CASE WHEN THEN ENDwygląda nieporadnie.

Możesz to zakodować za pomocą funkcji 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);

Spróbuj !!!

CAVEAT: CASE WHEN THEN ENDjest przydatny tylko w przypadku wielu wartości (więcej niż 2)

RolandoMySQLDBA
źródło
Fajnie, nie wiedziałem o tej funkcji JEŻELI. Czy możesz po prostu wyjaśnić: = JEŻELI (id = 1, Dlaczego tego potrzebujesz?
user3162468,
4
czy mogę tego użyć do aktualizacji około 100 000 rekordów w jednym zapytaniu?
AMB
4

INSERT ... ON DUPLICATE KEY UPDATE

Będziesz musiał napisać bardzo skomplikowane warunki, jeśli chcesz zaktualizować więcej niż dwa wiersze. W takim przypadku możesz zastosować INSERT ... ON DUPLICATE KEY UPDATEpodejście.

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);
Jarosław
źródło
3
Pamiętaj, że zwiększa to wartość autoinkrementacji dla tabeli, jeśli używasz autoinkrementacji. W przypadku tabel o dużej przepustowości, które mogą być niepożądane. Więcej informacji stackoverflow.com/a/23517191/2560641
Juliano