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
MySQL 1.3 г. Просмотров: 665
Оценить код:

Код был обновлён. Предыдущий рейтинг:

  • Бесполезный код - 0 голосов
  • Костыль - 0 голосов
  • Полезный код - 1 голос

Комментарии

Ваш комментарий будет первым.
Войдите, чтобы оставить комментарий.