223

我有一个包含两列唯一键的表:

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 

?

4

3 回答 3

387

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

如果您不关心错误(转换错误、外键错误)和自动增量字段耗尽(即使由于重复键未插入行也会增加),然后INSERT IGNORE像这样使用:

INSERT IGNORE INTO <table_name> (...) VALUES (...)
于 2011-01-04T17:15:05.620 回答
27

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

1.REPLACE INTO

优点:

  1. 简单的。

缺点:

  1. 太慢了。

  2. 如果有条目匹配,自动增量键将更改(增加 1),因为它会删除旧条目然后插入新条目。unique keyprimary 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_mode5.1 版之后的配置”如果您innodb用作引擎,但这也会影响并发性,因此在使用前需要充分考虑。到目前为止,我没有看到任何更好的解决方案。

于 2019-07-09T01:58:26.507 回答
1

Use ON DUPLICATE KEY UPDATE ...,
Negative :因为UPDATE第二个动作使用资源。

使用INSERT IGNORE ...,
Negative :如果出现问题,MySQL 不会显示任何错误,因此您无法处理错误。仅当您不关心查询时才使用它。

于 2018-05-28T07:49:01.630 回答