+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;
Функция REPLACE
REPLACE 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