Mysql update нескольких строчек по условию

Иногда нужно обновить в таблице MySql n-ое количество строк. Причем вставить не одно значение, а несколько в зависимости от условия.

Запрос будет таким

UPDATE tbl_name  SET fld = CASE

WHEN pid=16 THEN ’1′

WHEN pid=17 THEN ’2′

WHEN pid=19 THEN ’54′

ELSE fld END;

Причем если не поставить в конце ELSE fld, то все не подходящие по условию значения будут обнулены.

Для вставки синтаксис проще

INSERT INTO mytable (id, title) VALUES ('1', 'val1'), ('2', 'val2');

Разместить в Facebook

6 Responses to “ Mysql update нескольких строчек по условию ”

  1. Спасибо, я как раз искал такой вид обновления. думал придется по одному запросу на каждую запись делать. Просто супер!

  2. Сергей:

    Марк, здравствуйте!
    А можете подсказать как обновить у нескольких строк не одно поле, а, например, 2?

    я имею ввиду что-то типа этого:
    UPDATE tbl_name SET (a,b) = CASE
    WHEN id=1 THEN (555,666)
    ELSE (a,b) END;

  3. Сергей:

    Марк, можете уже не отвечать, сам нашел решение:)
    Делюсь со всеми, во благо всех! :)

    UPDATE tbl_name SET fld1 = CASE pid
    WHEN 1 THEN ‘значение fld1 для pid1′
    WHEN 2 THEN ‘значение fld1 для pid2′
    END, fld2 = CASE pid
    WHEN 1 THEN ‘значение fld2 для pid1′
    WHEN 2 THEN ‘значение fld2 для pid2′
    END WHERE pid IN(1, 2);

  4. admin:

    Спасибо, Сергей! Приму на вооружение.

    Только Марк еще маленький, 3 года только :)
    Пишет его папа Алексей

  5. john:

    Сергей, огромное спасибо за отличное решение! :)
    Но я бы, еще всё таки, добавил в ваш код ELSE, что бы другие поля не обнулялись:

    UPDATE tbl_name SET fld1 = CASE pid
    WHEN 1 THEN ‘значение fld1 для pid1?
    WHEN 2 THEN ‘значение fld1 для pid2?
    ELSE fld1
    END, fld2 = CASE pid
    WHEN 1 THEN ‘значение fld2 для pid1?
    WHEN 2 THEN ‘значение fld2 для pid2?
    ELSE fld2
    END WHERE pid IN(1, 2);

  6. Данил:

    Спасибо за это решение! Прямо в точку :)
    Обычно получается отыскать нужное решение прошерстив 5-6, а тут как раз решение моего вопроса — спасибо, буду Вас регулярно читать :)

Добавить комментарий

*