Обновление нескольких строк с несколькими значениями и несколькими условиями mysql
Я столкнулся с сложной ситуацией SQL-запросов. Задача состоит в том, чтобы обновить несколько строк, с несколькими значениями и несколькими условиями. Ниже приведены данные, которые я хочу обновить;
Поле для обновления: 'sales', поля условий: 'campid' и 'date':
if campid = 259 and date = 22/6/2011 then set sales = $200
else if campid = 259 and date = 21/6/2011 then set sales = $210
else if campid = 260 and date = 22/6/2011 then set sales = $140
else if campid = 260 and date = 21/6/2011 then set sales = $150
Я хочу обновить все это в одном запросе.
Ответы
Ответ 1
Попробуйте следующее:
UPDATE your_table SET sales =
CASE
WHEN campid = 259 AND date = 22/6/2011 THEN 200
WHEN campid = 259 AND date = 21/6/2011 THEN 210
WHEN campid = 259 AND date = 22/6/2011 THEN 140
WHEN campid = 259 AND date = 21/6/2011 THEN 150
ELSE sales
END
Естественно, я не знаю, действительно ли поле даты DATE или DATETIME, поэтому я оставил запрос, показывающий, что вы можете сделать, но, возможно, вам нужно установить сравнение дат в соответствии с типом данных.
Если поле даты - DATE (как следует), вы можете написать AND date = '2011-06-22'
и т.д.
Примечание ELSE
условие: необходимо избегать записей, не попадающих в другие случаи, будет установлено значение NULL.
Ответ 2
Вы, конечно, не должны делать это в одном запросе. Вместо этого, если вы намерены обновлять их атомарно, все в одно и то же время, вы должны выпустить несколько операторов UPDATE
в одной транзакции.
Вы не говорите, какую версию MySQL вы используете, а не какой механизм хранения. Предполагая, что InnoDB - это стандарт в последних версиях MySQL и обычно должен использоваться для транзакционных систем, а также если вы делаете это из клиента командной строки, вы бы
mysql> set autocommit=0;
mysql> UPDATE ....;
mysql> UPDATE ....;
mysql> ...
mysql> commit;
Затем вы можете повторно активировать автокоманду, если хотите, повторив первую строку, но со значением 1
:
mysql> set autocommit=1;
Ответ 3
Вместо того, чтобы писать SQL-запрос, который слишком сложный и связанный со временем, я считаю, что вам лучше потратить ваше время на создание объекта доступа к данным для обработки этих довольно простых манипуляций на основе записи. Это делает последующее сопровождение кода, а также разработку нового кода с использованием объектов доступа к данным намного проще, чем одноразовый, сложный SQL-запрос.