Множественный UPDATE в MySQL
11 марта 2009
Сразу предупреждаю, что эффективней использовать несколько «классических» запросов и, по возможности, транзакции (которые MyISAM не поддерживает). Так что… для общего развития:
Способ №1
UPDATE tbl_country SET price = CASE WHEN code = 1 THEN 123; WHEN code = 2 THEN 456; … END WHERE code IN (1,2,…)
Способ №2
INSERT INTO tbl_country (code, price) VALUES (1, 123), (2, 456), … ON DUPLICATE KEY UPDATE tbl_country.price = VALUES(price);
Комментарии RSS по email OK
Лучше бы ты INSERT ON DUPLICATE KEY показал ;)
Тогда уж REPLACE наверное :)
Сам-то пробовал свой запрос? Он все неверные записи, для которых CASE твой не выполнился NULL-ом заполнит. Советчик, блин. ОБЯЗАТЕЛЬНО необходимо сделать ELSE code.
aktuba
Способ №2 не оно?
zw0rk
Внимательнее надо быть… там как-бы WHERE IN имеется.
Почему несколько запросов быстрее чем один?
И что? Откуда уверенность, что все записи обладают нужным code?
zw0rk
Нашёл ошибочку у себя. Поправил: WHERE id IN на WHERE code IN. Скорее всего это вас и озадачило… и верно озадачило.
CharnaD
Из за CASE. Я проверял, если что…
Спасибо, даже не знал про эти трюки :)
Я примерно помнил как работать с IN(), ваша статья помогла окончательно вспомнить!
А что будет работать быстрее 1 запрос с 100 условий, или 100 запросов? Мне нужно сделать UPDATE у > 100 записей наиболее быстрым способом.
Смотря какой запрос.
Ну запрос я уже создал. Работает пока для малого кол-ва записей. А вот на большом кол-ве пока не проверял.
Такой, чтобы обновлял в каждой записи одно целочисленное поле, зная id записи этой.
Spasibo! Kratko, ponjatno i polezno!
zw0rk имел ввиду не это, а то что нужно в этом запросе поставить перед END ELSE price иначе обнулит те значения где code не равно ни единице ни двойке.
Спасибо за способы. Вопрос: можно ли в 1-м варианте применить несколько критериев WHERE? Мне нужно ... AND manual_price = '0';
Ага. Куда уж эффективней. 13к полей с "классикой" обновляются у меня минут 7, а единым запросом - менее полуминуты.
Александр, можно.
Спасибо, и еще вопрос - чем ограничивается длина запроса? my.cnf?
Размером пакета. Настраивается в my.cnf.
точки с запятой в запросе не нужны
Спасибо! Первый пример очень помог!
I wonder how I missed this. The first method is right. Thanks - Trey
Пример ещё одного варианта того же CASE
I think first method is correct.
UPDATE ttt st SET st.status = CASE WHEN Now() > st.ttd AND st.status in (0, 1, 2) THEN 3 END WHEN Now() BETWEEN st.tfd AND st.ttd and st.status in (0, 1, 3) THEN 2 END WHEN Now() < st.tfd and st.status in (1, 2, 3) THEN 0 END ELSE st.status END CASE WHERE st.status != 4
Что не так?