Оновлення кількох рядків з різними значеннями в одному запиті


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. Чи можете ви просто пояснити: = ЯКЩО (id = 1, навіщо це вам потрібно?
user3162468

4
чи можу я використовувати це для оновлення близько 100 тис. записів у sinle-запиті?
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.