MySQL 中的REPLACE INTO
函数以删除和插入行的方式工作。在我的表中,主键 ( id
) 是自动递增的,所以我期待它删除然后id
在数据库尾部插入一个表。
但是,它会出乎意料并以相同的方式插入它id
!这是预期的行为,还是我在这里遗漏了什么?id
(调用REPLACE INTO
语句时我没有设置)
MySQL 中的REPLACE INTO
函数以删除和插入行的方式工作。在我的表中,主键 ( id
) 是自动递增的,所以我期待它删除然后id
在数据库尾部插入一个表。
但是,它会出乎意料并以相同的方式插入它id
!这是预期的行为,还是我在这里遗漏了什么?id
(调用REPLACE INTO
语句时我没有设置)
如果您的表中有另一个索引,则这是一种预期的行为,UNIQUE
否则它会按照您的预期添加该行。请参阅文档:
REPLACE 的工作方式与 INSERT 完全相同,只是如果表中的旧行与 PRIMARY KEY 或 UNIQUE 索引的新行具有相同的值,则在插入新行之前删除旧行。请参见第 13.2.5 节,“INSERT 语法”。
https://dev.mysql.com/doc/refman/5.5/en/replace.html
这也很有意义,因为 mySQL 将如何找到要替换的行?它只能扫描整个表,这将非常耗时。我创建了一个 SQL Fiddle 来演示这一点,请看这里
这是预期的行为。从技术上讲,如果要替换/插入的数据上的所有唯一键(不仅仅是主键)与现有行匹配,MySQL 实际上会删除现有行并使用替换数据插入新行,使用相同的值对于所有唯一键。因此,如果您查看此类查询中受影响的行数,每次替换将获得 2 个受影响的行,而对于直接插入,您将获得 2 个受影响的行。