Обновление нескольких строк с разными значениями в одном запросе


12

Я пытаюсь понять, как ОБНОВИТЬ несколько строк с разными значениями, и я просто не понимаю. Решение есть везде, но мне кажется, что это трудно понять.

Например, два обновления в 1 запросе:

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

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

Я не понимаю, что СЛУЧАЙ, КОГДА ... ТО ... КОНЕЦ работает и как его использовать.

Интересно, может ли кто-нибудь помочь мне в этом?

Ответы:


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

Лично использование CASE WHEN THEN ENDвыглядит неуклюже.

Вы можете кодировать это, используя функцию 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);

Попробуйте!

CAVEAT: CASE WHEN THEN ENDудобно только при работе с несколькими значениями (более 2)


Хорошо, я не знал об этой функции IF. Можете ли вы просто объяснить: = IF (id = 1, Зачем вам это нужно?
user3162468

4
Могу ли я использовать это для обновления около 100 тыс. записей в одном запросе?
AMB

4

INSERT ... ON DUPLICATE KEY UPDATE

Вам нужно будет написать очень сложные условия, если вы хотите обновить более двух строк. В таком случае вы можете использовать INSERT ... ON DUPLICATE KEY UPDATEподход.

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
Обратите внимание, что это увеличивает значение автоинкремента для таблицы, если вы используете автоинкремент. Для таблиц с высокой пропускной способностью это может быть нежелательным. Дополнительная информация stackoverflow.com/a/23517191/2560641
Джулиано
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.