天天看点

MySQL:ON DUPLICATE KEY UPDATE 存在一个问题

今天在开发时候,存在这样一个需求场景:需要获取数据库中的数据记录,如果存在该记录则更新该记录中的某些字段值;如果查询结果为空即不存在该记录,则要插入一条新的纪录;

接手过来的代码模块是这样实现的:

MySQL:ON DUPLICATE KEY UPDATE 存在一个问题

先通过sql查询数据,然后判断是否为空,再去update或者insert~

然后就想去把代码优化一下,了解到MySQL一条语句可以解决这个问题:ON DUPLICATE KEY UPDATE

该语句的语法如下:

INSERT INTO tablename(field1,field2, field3, ...) VALUES(value1, value2, value3, ...) ON DUPLICATE KEY UPDATE field1=value1,field2=value2, field3=value3, ...; 
           

这个语法的目的是为了解决重复性,当数据库中存在某个记录时,执行这条语句会更新它,而不存在这条记录时,会插入它。

该语句规则如下:如果你插入的记录导致一个UNIQUE索引或者primary key(主键)出现重复,那么就会认为该条记录存在,则执行update语句而不是insert语句,反之,则执行insert语句而不是更新语句。

得到了这个方法,果断替换掉原有方法,代码简洁明了多了,如下:

MySQL:ON DUPLICATE KEY UPDATE 存在一个问题

原以为万事大吉,搞定完事了。

结果自测时候发现了实际效果不跟预期结果一样,经排查发现这个方法使用存在问题:

当操作的存在主键跟索引不一致的情况时,比如表主键是id,索引是a_b;

该语句会先执行insert,判断主键id是否存在重复,不存在则插入新数据;但这个时候如果a_b是有重复的,则该语句会正常执行(即不报错)但是并不会更新数据或者插入新纪录;

这种情况下,我们期待的数据更新就没有如期进行,会造成严重的数据丢失问题!!!