【问题标题】:INSERT ... ON DUPLICATE KEY (do nothing)INSERT ... ON DUPLICATE KEY(什么都不做)
【发布时间】:2011-06-03 12:59:57
【问题描述】:

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

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 

?

【问题讨论】:

    标签: mysql sql unique-key


    【解决方案1】:

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

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

    INSERT IGNORE INTO <table_name> (...) VALUES (...)
    

    【讨论】:

    • 只是在INSERT后面加上IGNORE,其他语法一样吗?
    • @ufk: INSERT IGNORE 没有 ON DUPLICATE KEY 部分,例如INSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
    • 请注意,INSERT IGNORE 也会忽略其他错误,例如数据转换失败。
    • 所以我将使用 ON DUPLICATE KEY UPDATE id=id。我只想忽略键重复而不是任何其他类型的错误。
    • 注意 INSERT IGNORE 会增加自动增量列,即使该行没有插入
    【解决方案2】:

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

    1。 REPLACE INTO

    优点:

    1. 简单。

    缺点:

    1. 太慢了。

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

    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 作为引擎,“自动增量列将取决于innodb_autoinc_lock_mode 5.1 版之后的配置”,但这也会影响并发性,所以它使用前需要好好考虑。到目前为止,我还没有看到任何更好的解决方案。

    【讨论】:

    • 5.1 版之后的自动增量列取决于innodb_autoinc_lock_mode 配置
    【解决方案3】:

    使用ON DUPLICATE KEY UPDATE ...
    否定:因为UPDATE 将资源用于第二个操作。

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

    【讨论】:

    • @abdul 有 mysql 支持你在这里解释的吗?
    猜你喜欢
    • 1970-01-01
    • 2010-10-07
    • 2023-03-07
    • 2013-10-03
    • 2022-08-02
    • 2011-01-29
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多