Mysql replace关键字类似于insert关键字,不过replace首先会尝试插入一条新的数据,如果抛出异常(检查表的主键和唯一索引)则会删除该条数据,然后再次插入数据,这就是为什么sql执行后会返回2 rows受影响。
如果表的主键和唯一索引同时存在,则会导致主键增长过快,且如果replace的数据存在,如果replace字段没有覆盖所有字段会导致删除数据、新增的时候数据丢失(甚至报错,如果丢失字段非空但又没有默认值的时候)。
之前为了偷懒想着新增修改一条sql就用了replace,但是发现修改数据的时候发现数据丢失,真的是得不偿失。公司项目当时用replace的场景是消息盒子里不同类消息显示最新一条消息,有一张辅助的表来存储最新的消息,这张表没有主键,一个唯一索引,且数据量较大。
细想是没有仔细理解replace导致滥用,现在更深入的了解了之后发现replace慎用,慎用啊!!!