ВСТАВИТЬ... НА КЛЮЧЕ ДУБЛИКАТ (ничего не делать)

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

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 

?

Ответ 1

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

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

Ответ 2

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

1. REPLACE INTO

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

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

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

2. INSERT IGNORE

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

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

3. INSERT... ON DUPLICATE KEY UPDATE

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

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

Ответ 3

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

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