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