ВСТАВИТЬ... НА КЛЮЧЕ ДУБЛИКАТ (ничего не делать)
У меня есть таблица с уникальным ключом для двух столбцов:
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 не будет показывать никаких ошибок, если что-то пойдет не так, поэтому вы не можете обработать ошибки. Используйте его, только если вы не заботитесь о запросе.