ВСТАВИТЬ ... НА ДУБЛИКОВАННОМ КЛЮЧЕ (ничего не делать) - PullRequest
171 голосов
/ 04 января 2011

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

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 

Ответы [ 3 ]

291 голосов
/ 04 января 2011

Да, есть INSERT IGNORE, или вы можете сделать ON DUPLICATE KEY UPDATE id=id.

0 голосов
/ 09 июля 2019

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

1. REPLACE INTO

удалить и вставить новую запись, если есть совпадения unique key или primary key

плюсы: просто.

минусы: 1. слишком медленно. 2. ключ автоинкремента увеличится.

2. INSERT IGNORE

плюсы: просто.

минусы: 1. Ключ автоинкремента все равно будет увеличиваться. 2. некоторые другие ошибки будут игнорироваться, такие как ошибка преобразования данных.

3. INSERT ... ON DUPLICATE KEY UPDATE

плюсы: ключ автоинкремента НЕ увеличивается.

минусы: выглядит относительно сложным.

0 голосов
/ 28 мая 2018

Использование ON DUPLICATE KEY UPDATE ...,
Отрицательный: потому что UPDATE использует ресурсы для второго действия.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...