15

MySQL 中的REPLACE INTO函数以删除和插入行的方式工作。在我的表中,主键 ( id) 是自动递增的,所以我期待它删除然后id在数据库尾部插入一个表。

但是,它会出乎意料并以相同的方式插入它id!这是预期的行为,还是我在这里遗漏了什么?id(调用REPLACE INTO语句时我没有设置)

4

2 回答 2

14

如果您的表中有另一个索引,则这是一种预期的行为,UNIQUE否则它会按照您的预期添加该行。请参阅文档:

REPLACE 的工作方式与 INSERT 完全相同,只是如果表中的旧行与 PRIMARY KEY 或 UNIQUE 索引的新行具有相同的值,则在插入新行之前删除旧行。请参见第 13.2.5 节,“INSERT 语法”。

https://dev.mysql.com/doc/refman/5.5/en/replace.html

这也很有意义,因为 mySQL 将如何找到要替换的行?它只能扫描整个表,这将非常耗时。我创建了一个 SQL Fiddle 来演示这一点,请看这里

于 2012-08-30T20:55:13.673 回答
3

这是预期的行为。从技术上讲,如果要替换/插入的数据上的所有唯一键(不仅仅是主键)与现有行匹配,MySQL 实际上会删除现有行并使用替换数据插入新行,使用相同的值对于所有唯一键。因此,如果您查看此类查询中受影响的行数,每次替换将获得 2 个受影响的行,而对于直接插入,您将获得 2 个受影响的行。

于 2012-08-30T20:48:38.660 回答