MySQL: Обновление при дублировании ключа ON DUPLICATE KEY
Обновление записи в таблице при дублировании ключа с помощью MySQL.
Создадим тестовую таблицу, куда будем записывать id пользователя (uid), основной цвет (primary_color), время записи (time). Поле uid является уникальным.
CREATE TABLE test ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, uid INT UNSIGNED NOT NULL, primary_color VARCHAR(20) NOT NULL, time INT UNSIGNED NOT NULL, PRIMARY KEY(id), UNIQUE KEY(uid) ) ENGINE=InnoDB;
Добавим запись в таблицу для пользователя с id = 1. Значение цвета будет рандомным из встроенного набора данных.
INSERT INTO `test` ( `uid`, `primary_color`, `time` ) VALUES ( 1, elt(floor(rand() * 3 + 1), 'red', 'green', 'blue'), UNIX_TIMESTAMP() )
Попытка повторно выполнить этот SQL-запрос приведёт к ошибке: #1062 - Дублирующаяся запись '1' по ключу 'uid'
Для корректного выполнения нужно добавить конструкцию ON DUPLICATE KEY UPDATE. В примере указано, что при дублировании ключа нужно обновить значения цвета и времени.
INSERT INTO `test` ( `uid`, `primary_color`, `time` ) VALUES ( 1, elt(floor(rand() * 3 + 1), 'red', 'green', 'blue'), UNIX_TIMESTAMP() ) ON DUPLICATE KEY UPDATE `primary_color` = VALUES( `primary_color` ), `time` = VALUES( `time` )
Если обновлять записи не нужно, то можно добавить флаг IGNORE. В таком случае все дублирующие записи будут проигнорироваы. Новые добавлены. В данном примере значения копируются из таблицы test2.
INSERT IGNORE INTO `test` ( `uid`, `primary_color`, `time` ) SELECT a . `id` as `uid`, a . `primary_color`, a . `time` FROM `test2` a WHERE a . `id` > 2
Комментарии