mysql的replace into“坑”

在向表中插入数据的时候,经常遇到这样的情况:1. 首先判断数据是否存在; 2. 如果不存在,则插入;3.如果存在,则更新。
 
这种情况就可以使用replace into语句来解决,但是有没有问题,且看下去
 
下面是数据更新前的样子

在auto这个表中,k字段是唯一索引,当执行replace into auto (k,v) values (10,11);后,数据变为
 

 
 从图中可以看到,id=10的那条记录没有了,新增加了一条id=23的记录,而且k,v的值正好是咱们刚想更新的值
 
再执行一个语句replace into auto (k,v) values (9,9);观察结果如下
 
这次是真的增加了一条id=24的记录,而其他记录没有任何变化。
 
通过以上操作可以看出replace into执行的逻辑
1、遇到PRIMARY KEY或UNIQUE索引的,新记录与旧记录有冲突的(这里实际产生了异常duplicate key error),会把旧记录删除,然后再插入新记录
2、若是新记录没有冲突,就直接插入一条新记录,与insert into一样
 
看起来很正常,这里针对第一种逻辑会有问题
1、把旧记录删除之后,插入的新记录只是插入了那些指定的字段,原本不想更新的字段,直接为默认值了,会导致数据丢失
2、若旧记录的id跟其他表是有关联的,更新后新记录会产生新的id,导致这种关联丢失
3、而且使用replace into会导致自增主键id一直增大,很容易导致id值范围不够用
另外,若是数据库存在主从关系,在主机器上进行了replace into操作之后,从机器上对应表的AUTO_INCREMENT是不会更新的,导致从机器转为主机器时,新插入数据会出现异常,直到AUTO_INCREMENT增加到原来主机器的值为止。 

猜你喜欢

转载自jjhpeopl.iteye.com/blog/2368927
今日推荐