ВСТАВИТЬ… НА КЛЮЧЕВОЙ КЛЮЧ (ничего не делать)


184

У меня есть таблица с уникальным ключом для двух столбцов:

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 

?

Ответы:


332

Да, используйте INSERT ... ON DUPLICATE KEY UPDATE id=id(он не будет запускать обновление строки, даже если idон назначен самому себе).

Если вас не волнуют ошибки (ошибки преобразования, ошибки внешнего ключа) и исчерпание полей автоинкремента (оно увеличивается, даже если строка не вставлена ​​из-за дублирующего ключа), используйте INSERT IGNORE.


5
просто добавить IGNORE после вставки, остальной синтаксис такой же?
UFK

25
@ufk: INSERT IGNOREбез ON DUPLICATE KEYдетали, напримерINSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
BoltClock

125
Обратите внимание, что INSERT IGNORE также игнорирует другие ошибки, такие как сбои преобразования данных.
mjcopple

36
поэтому я буду использовать ON DUPLICATE KEY UPDATE id = id. Я хочу только игнорировать дубликаты ключей, а не любые другие виды ошибок.
UFK

7
будьте осторожны, INSERT IGNORE будет увеличивать столбец автоинкремента, даже если строка не вставлена
WorM

9

КАК ОСУЩЕСТВЛЯТЬ «вставить, если не существует»?

1. REPLACE INTO

плюсы:

  1. просто.

минусы:

  1. слишком медленно.

  2. автоинкрементная ключ ИЗМЕНИТЬ (увеличение на 1) , если есть въездные матчи unique keyили primary key, поскольку она удаляет старую запись затем вставить новую.

2. INSERT IGNORE

плюсы:

  1. просто.

минусы:

  1. Ключ автоинкремента не изменится, если есть совпадения unique keyзаписей, primary keyно индекс автоинкремента увеличится на 1

  2. некоторые другие ошибки / предупреждения будут игнорироваться, такие как ошибка преобразования данных.

3. INSERT ... ON DUPLICATE KEY UPDATE

плюсы:

  1. Вы можете легко реализовать функцию «сохранить или обновить» с этим

минусы:

  1. выглядит относительно сложным, если вы просто хотите вставить не обновлять.

  2. Ключ автоинкремента не изменится, если есть совпадения unique keyзаписей, primary keyно индекс автоинкремента увеличится на 1

4. Любой способ остановить увеличение ключа автоинкремента, если есть совпадения ввода unique keyили primary key?

Как упомянуто в комментарии ниже @toien: «Столбец автоинкремента будет зависеть от innodb_autoinc_lock_modeконфигурации после версии 5.1», если вы используете его в innodbкачестве движка, но это также влияет на параллелизм, поэтому его необходимо тщательно изучить перед использованием. Пока что я не вижу лучшего решения.


автоинкрементный колонок будет осуществляться в зависимости от innodb_autoinc_lock_modeконфигурации после версии 5.1
toien

1

Use ON DUPLICATE KEY UPDATE ...,
Negative: потому что UPDATEиспользует ресурсы для второго действия.

Использование INSERT IGNORE ...,
Negative: MySQL не будет показывать какие - либо ошибки , если что - то пойдет не так, так что вы не можете справиться с ошибками. Используйте его, только если вы не заботитесь о запросе.


@abdul Есть ли поддержка MySQL, что вы здесь объяснили?
Лалит Тарсария
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.