首页 > 解决方案 > REPLACE 是否有可能在 INSERT 上失败?

问题描述

我有一个要插入记录的表。它有一个由两个字段组成的主键。到目前为止,我的语法很简单:

INSERT into table (field ,field ,field ) VALUES ('foo', 'bar', foo')type deal,但我遇到了可能需要覆盖现有值的场景。

我很熟悉,过去也使用过这种INSERT INTO .... ON DUPLICATE KEY UPDATE...语法,但最近我遇到了更简单的REPLACE INTO...语法。

我对此的假设REPLACE INTO是,如果我正在写入的主键不存在数据,它将充当 INSERT。但是,如果主要确实存在,它将删除记录并插入新记录。这个对吗?

如果这是正确的,那么我只是放弃该INSERT INTO...语句并运行REPLACE INTO...100% 的用户插入表中的行有什么缺点吗?使用REPLACE INTO...100% 的时间是否有任何潜在风险?

标签: mysqlinsert

解决方案


REPLACE 首先执行 DELETE,因此如果您将外键约束与 ON DELETE CASCADE 一起使用,您可能会无意中删除大量相关数据。REPLACE 的重新插入步骤不会恢复从依赖表中删除的数据。

我想我已经看到了 REPLACE 导致为主键生成新的自动增量值的情况。也许如果冲突基于辅助 UNIQUE KEY 而不是主键,即使您不使用外键约束,也可能会抛出对该行的其他引用。


推荐阅读