Atualizando várias linhas com valores diferentes em uma consulta

12

Estou tentando entender como atualizar várias linhas com valores diferentes e simplesmente não entendi. A solução está em toda parte, mas para mim parece difícil de entender.

Por exemplo, duas atualizações em uma 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;

Não entendo o que o CASE WHEN .. THEN ... END funciona e como usá-lo.

Gostaria de saber se alguém poderia me ajudar nisso.

user3162468
fonte

Respostas:

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

Pessoalmente, CASE WHEN THEN ENDparece desajeitado.

Você pode codificar isso usando a função SE .

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

De uma chance !!!

CAVEAT: CASE WHEN THEN ENDsó é útil quando se lida com vários valores (mais de 2)

RolandoMySQLDBA
fonte
Bom, eu não sabia sobre essa função SE. Você pode simplesmente explicar: = IF (id = 1, Por que você precisa disso?
user3162468
4
posso usar isso para atualizar cerca de 100k registros na consulta sinle?
AMB
4

INSERT ... ON DUPLICATE KEY UPDATE

Você precisará escrever condições muito complicadas se desejar atualizar mais de duas linhas. Nesse caso, você pode usar a INSERT ... ON DUPLICATE KEY UPDATEabordagem.

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);
Yaroslav
fonte
3
Observe que isso aumenta o valor do incremento automático da tabela, se você estiver usando o incremento automático. Para tabelas de alto rendimento que podem ser indesejáveis. Mais informações stackoverflow.com/a/23517191/2560641
Juliano