Синтаксис команды UPDATE
Запросы на изменение данных в уже существующей таблице в языке SQL выполняются при помощи команды UPDATE.
UPDATE [LOW_PRIORITY] [IGNORE] имя_таблицы
SET поле1=значение1 [, поле2=значение2 ...]
[WHERE условие]
[ORDER BY список полей]
[LIMIT число_строк];
- В инструкции SET указывается, какие именно поля должны получит новые значения и сами эти значения.
- В инструкции WHERE можно указать условие, которому должны соответствовать обновляемые записи. Если инструкция WHERE пропущена, то обновлению подвергаются все записи данной таблицы.
- Если указана инструкция LOW_PRIORITY, то обновлению присваивается низкий приоритет. Это значит, что обновление произойдет тогда, когда все другие пользователи не закончат просмотр данных таблицы.
- Инструкция IGNORE указывает СУБД, каким образом реагировать на дублирование первичного ключа. Если инструкция пропущена, то в случае возникновения дублей команда UPDATE будет прервана. При наличии IGNORE прерывания не случится, а записи с дублями первичного ключа будут пропущены.
- Инструкция ORDER BY упорядочивает таблицу по выбранным полям.
- Инструкция LIMIT позволяет обновить строго заданное количество строк. Само по себе использование LIMIT редко имеет смысл, так как обновляются произвольные строки, cоответствующие условию WHERE.
Рассмотрим таблицу tovar со следующими данными:
Увеличим на 10% цену тех товаров, которые имеют исходную цену больше 300р.
UPDATE Tovar SET price=price*1.1 WHERE price > 300;
Результат:
Обновление соединения таблиц
В качестве таблицы при выполнении UPDATE вполне может фигурировать соединение таблиц при помощи оператора JOIN (LEFT JOIN, RIGHT JOIN). А присваиваемое значение может выбираться при помощи оператора CASE. В этом случае синтаксис команды UPDATE будет таким:
UPDATE таблица1 [LEFT | RIGHT] join таблица2 on таблица1.поле1=таблица2.поле2
SET поле3=CASE поле4
WHEN значение1_поля4 THEN значение1
WHEN значение2_поля4 THEN значение2
WHEN значение3_поля4 THEN значение3
…
ELSE значение4_поле4 END;
Пусть необходимо увеличить на 10% цены кровельных материалов, на 20% цены лакокрасочных материалов и на 30% цены инструментов. Наименование категории товара указано в таблице category.
UPDATE tovar left join category on tovar.categ=category.itcateg
SET price=case category.categ_name
WHEN "Кровельные" THEN price*1.1
WHEN "Лакокрасочные" THEN price*1.2
WHEN "Инструменты" THEN price*1.3
ELSE price END;
Обновление с вложенным запросом
В инструкции WHERE также можно использовать вложенный запрос (подзапрос).
UPDATE таблица1 SET поле1=значение1, поле2=значение2….
WHERE полеN IN
(SELECT таблица2.поле1 FROM таблица2 WHERE условие);
Пусть имеется таблица discount, где перечислены названия товаров, на которые должна быть предоставлена скидка. Всем товарам, которые есть в этом списке, нужно снизить цену на 10%.
UPDATE tovar SET price=0.9*price WHERE tovar_name IN (SELECT discount.tovar_name FROM discount);
В этом запорсе сначала будет сформирован список названий дисконтных товаров подзапросом:
SELECT discount.tovar_name FROM discount
После этого будут обновлены те строки таблицы tovar, в которых поле tovar_name имеет значение, входящее в сформированный на предыдущем шаге список.
Обновление с упорядочиванием
Пусть необходимо увеличить уникальный код всех товаров idtovar на 1. То есть товар с кодом 1 должен получить код 2, товар с кодом 2 должен получить код 3 и т.д. Команда UPDATE обновляет таблицу, последовательно перебирая строки. Когда код первого товара заменяется с 1 на 2, в таблице все еще есть товар с кодом 2 (до его обновления еще не дошла очередь). Таким образом, возникает дублирование первичного ключа и ошибка. Эту проблему можно решить, используя команду UPDATE вместе с ORDER BY. Нужно просто упорядочить коды товаров в обратном порядке и начать обновлять таблицу с конца:
UPDATE tovar SET idtovar=1+idtovar ORDER BY idtovar DESC;