REPLACE INTO

简介

在数据库中,REPLACE INTO 是一种用于插入或更新数据的 DML SQL 语句。它与 INSERT INTO 语句类似,但具有一些特殊的行为。

语法

1
2
REPLACE INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);

replace into在binlog中的表现形式

表中只有PK primary key

PK冲突 binlog update

PK不冲突 binlog insert

表中PK primary key 和UK unikue key 共存

PK冲突 UK不冲突 binlog delete insert

PK不冲突 UK冲突 binlog update

PK冲突 UK冲突 binlog delete insert

PK不冲突 UK不冲突 binlog (insert)

注意事项

  • 插入数据的表必须有主键或者是唯一索引,否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据;
  • 如果数据库里边有这条记录,则直接修改这条记录;如果没有则,则直接插入,在有外键的情况下,对主表进行这样操作时,因为如果主表存在一条记录,被从表所用时,直接使用replace into是会报错的,这和replace into的内部原理是相关 先删除然后再插入 ;
  • 频繁的REPLACE INTO 会造成新纪录的主键的值迅速增大。总有一天。达到最大值后就会因为数据太大溢出了。就没法再插入新纪录了。数据表满了,不是因为空间不够了,而是因为主键的值没法再增加了;
  • replace操作在自增主键的情况下 表中有自增主键时 ,某些情况冲突时执行的是delete insert,但是在记录binlog时,却记录成了update操作,update操作不会涉及到auto_increment的修改。备库应用了binlog之后,备库的表的auto_increment属性不变。如果主备库发生主从切换,备库变为原来的主库,写新的主库则有风险发生主键冲突。