+7(983)178-57-68
Новые горизонты успешного бизнеса!
MySQL, REPLACE и ON DUPLICATE KEY UPDATE пример
Рассмотрим две функции в MySQL, которые позволяют вставить или обновить запись.Итак, допустим у нас есть таблица с товарами

В нашей таблице столбец 'uc' содержит уникальные значения, в нем мы храним код товара.
Код создания таблицы
CREATE TABLE `tbl` (
`id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`uc` mediumint(6) UNSIGNED ZEROFILL NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `tbl`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `uc` (`uc`);
ALTER TABLE `tbl`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
Функция REPLACEREPLACE INTO `tbl` SET `name`= 'Товар 9', `uc`='000009'
Так как наш уникальный код, в данном случае 000009, отсутствует в таблице, этот запрос просто добавит новую строку в нашу таблицу
Но если уникальный код будет найден в нашей таблице, произойдет перезапись
REPLACE INTO `tbl` SET `name`= 'Товар 10', `uc`='000009'

Как вы видите, имя товара обновилось, а код остался тот же.
Теперь используем функцию INSERT INTO ON DUPLICATE KEY UPDATE
INSERT INTO `tbl` SET `name`= 'Товар 11', `uc`='000009' ON DUPLICATE KEY UPDATE `name`= 'Товар 11'
Результат:
Имя товара обновилось.
Если бы 'uc' равный 000009 не был найден в нашей таблице, то данная команда просто добавила бы новую строку в нашу таблицу.
Как вы видите обе эти функции дают примерно тот же результат.
В чем же их отличия?
Очень важное отличие в том, как всё это работает. REPLACE при срабатывании ограничения, в нашем случае найден код 000009, удаляет запись (и вызывает ON DELETE CASCADE) и затем вставляет новую, поэтому у Товара 10 изменилось значение столбца 'id', было 9, стало 10.
ON DUPLICATE KEY UPDATE в свою очередь просто обновляет запись без удаления, что конечно происходит быстрее. Так же нужно помнить что, если у вас есть какие-то поля (не указанные в запросе) со значениями отличными от DEFAULT, то UPDATE их не затронет. А REPLACE вставит новую запись с уже DEFAULT-значениями.
Остались вопросы? Спрашивайте!
Понравилась статья? Расскажи другим :)
Опубликовано: | Просмотров: 11997