插入…在重复键上(不执行任何操作)


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 

Answers:


331

是的,使用INSERT ... ON DUPLICATE KEY UPDATE id=id(即使id已分配给自身,它也不会触发行更新)。

如果您不关心错误(转换错误,外键错误)和自动递增字段用尽(即使由于重复的键而未插入行,它也会增加),请使用INSERT IGNORE


5
只是在INSERT之后添加IGNORE,其余语法是否相同?
ufk 2011年

25
@ufk:INSERT IGNORE没有这个ON DUPLICATE KEY部分,例如INSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
BoltClock

125
请注意,INSERT IGNORE也将忽略其他错误,例如数据转换失败。
mjcopple 2011年

36
所以我将使用ON DUPLICATE KEY UPDATE ID = ID。我只想忽略关键重复项,而不忽略任何其他类型的错误。
ufk 2011年

7
请注意,即使未插入行,INSERT IGNORE也将增加自动增加的列
WorM 18'Nov

9

如何实施“如果不存在则插入”?

1。 REPLACE INTO

优点:

  1. 简单。

缺点:

  1. 太慢了。

  2. 如果条目匹配或,则自动增量键将更改(增加1),因为它会删除旧条目,然后插入新条目。unique keyprimary key

2。 INSERT IGNORE

优点:

  1. 简单。

缺点:

  1. 如果条目匹配自动增量键将不会改变unique keyprimary key但自动递增指数将增加1

  2. 其他一些错误/警告将被忽略,例如数据转换错误。

3。 INSERT ... ON DUPLICATE KEY UPDATE

优点:

  1. 您可以轻松地实现“保存或更新”功能

缺点:

  1. 如果您只想插入而不更新,则看起来相对复杂。

  2. 如果条目匹配自动增量键将不会改变unique keyprimary key但自动递增指数将增加1

4.如果存在条目匹配unique keyprimary key?,有什么方法可以停止自动递增键的增加?

如@toien在下面的注释中所述:innodb_autoinc_lock_mode如果您将其innodb用作引擎,则“自动增量列将取决于5.1版之后的配置” ,但这也会影响并发性,因此在使用前需要进行充分考虑。到目前为止,我没有看到任何更好的解决方案。


innodb_autoinc_lock_mode5.1版之后,自动增加列将取决于配置
toien

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.