266
Приложение B
Однако при следующем посещении клиентом
того же отделения потре
буется
обновить
существующую запись, а не вставлять новую. В про
тивном случае будет получена следующая ошибка:
ERROR 1062 (23000): Duplicate entry '15' for key 1
Чтобы избежать этой ошибки, можно запросить таблицу
branch_usage
и посмотреть, имеется ли данная пара значений клиент/отделение,
а затем уже вставить запись, если таковой не найдено,
или обновить
имеющуюся строку, если она уже существует. Однако чтобы избавить
пользователей от хлопот, разработчики MySQL расширили выраже
ние
insert
и обеспечили возможность определять необходимость изме
нения
одного или нескольких столбцов, если выражение
insert
дает
сбой изза дублирования ключей. Следующее выражение предписыва
ет серверу изменять столбец
last_visited_on
, если данные клиент и от
деление
уже есть в таблице
branch_usage
:
mysql>
INSERT INTO branch_usage (branch_id, cust_id, last_visited_on)
> VALUES (1, 5, CURRENT_TIMESTAMP( ))
> ON DUPLICATE KEY UPDATE last_visited_on = CURRENT_TIMESTAMP( );
Query OK, 2 rows affected (0.02 sec)
Блок
on
duplicate
key
(при дублировании ключа) позволяет выполнять
одно и то же выражение при каждом появлении клиента с ID 5 в отде
лении с ID 1. Если выражение выполняется 100 раз, в результате пер
вого прогона в таблицу добавляется одна строка. Следующие 99 выпол
нений обеспечивают изменение столбца
last_visited_on
соответственно
Замещение команды replace
До версии 4.1 сервера MySQL операции с возможностью обновле
ния и вставки осуществлялись с помощью команды
replace
(за
местить). Это собственное выражение, которое сначала удаляет
существующую строку, если такое
значение первичного ключа
уже существует, а потом уже вставляет новую строку в таблицу.
Выполняя операции с возможностью обновления и вставки при
работе с версией 4.1 и более поздними, можно выбирать между
командами
replace
и
insert...on
duplicate key
.
Однако команда
replace
выполняет операцию удаления при
встрече дублирующихся значений ключей, что может обусло
вить
цепную реакцию, если используется механизм хранения
InnoDB и наложены ограничения внешнего ключа. Если ограни
чения созданы посредством опции
on
delete
cascade
, при удале
нии строки
целевой таблицы команда
replace
может автоматиче
ски удалить и строки других таблиц. Поэтому обычно более без
опасным считается использование блока
on
duplicate
key
выраже
ния
insert
, а не более старой команды
replace
.
MySQLCрасширения
языка SQL
267
текущему времени. Такой тип операций часто называют
операциями
с возможностью обновления и вставки
(
upsert
), т. е. сочетанием выра
жений
update
и
insert
.
Достарыңызбен бөлісу: