У меня есть таблица с уникальным ключом для двух столбцов:
CREATE TABLE `xpo`.`user_permanent_gift` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`fb_user_id` INT UNSIGNED NOT NULL ,
`gift_id` INT UNSIGNED NOT NULL ,
`purchase_timestamp` TIMESTAMP NULL DEFAULT now() ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `user_gift_UNIQUE` (`fb_user_id` ASC, `gift_id` ASC) );
Я хочу вставить строку в эту таблицу, но если ключ существует, ничего не делать! Я не хочу, чтобы генерировалась ошибка, потому что ключи существуют.
Я знаю, что есть следующий синтаксис:
INSERT ... ON DUPLICATE KEY UPDATE ...
но есть ли что-то вроде:
INSERT ... ON DUPLICATE KEY DO NOTHING
?
mysql
sql
unique-key
УФК
источник
источник
INSERT IGNORE
безON DUPLICATE KEY
детали, напримерINSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
КАК ОСУЩЕСТВЛЯТЬ «вставить, если не существует»?
1.
REPLACE INTO
плюсы:
минусы:
слишком медленно.
автоинкрементная ключ ИЗМЕНИТЬ (увеличение на 1) , если есть въездные матчи
unique key
илиprimary key
, поскольку она удаляет старую запись затем вставить новую.2.
INSERT IGNORE
плюсы:
минусы:
Ключ автоинкремента не изменится, если есть совпадения
unique key
записей,primary key
но индекс автоинкремента увеличится на 1некоторые другие ошибки / предупреждения будут игнорироваться, такие как ошибка преобразования данных.
3.
INSERT ... ON DUPLICATE KEY UPDATE
плюсы:
минусы:
выглядит относительно сложным, если вы просто хотите вставить не обновлять.
Ключ автоинкремента не изменится, если есть совпадения
unique key
записей,primary key
но индекс автоинкремента увеличится на 14. Любой способ остановить увеличение ключа автоинкремента, если есть совпадения ввода
unique key
илиprimary key
?Как упомянуто в комментарии ниже @toien: «Столбец автоинкремента будет зависеть от
innodb_autoinc_lock_mode
конфигурации после версии 5.1», если вы используете его вinnodb
качестве движка, но это также влияет на параллелизм, поэтому его необходимо тщательно изучить перед использованием. Пока что я не вижу лучшего решения.источник
innodb_autoinc_lock_mode
конфигурации после версии 5.1Use
ON DUPLICATE KEY UPDATE ...
,Negative: потому что
UPDATE
использует ресурсы для второго действия.Использование
INSERT IGNORE ...
,Negative: MySQL не будет показывать какие - либо ошибки , если что - то пойдет не так, так что вы не можете справиться с ошибками. Используйте его, только если вы не заботитесь о запросе.
источник