mysql replace into 缺陷的解决方案

replace into 实现原理是:如果新插入行的主键或唯一键在表中已经存在,则会删除原有记录并插入新行;如果在表中不存在,则直接插入。这样就会存在缺陷,如果某个字段有默认值,在使用replace into做数据修改时会将默认值的字段恢复到默认值,造成数据丢失。

如下所示,假设有一个表role,其中role_create_time与role_update_time默认值为当前时间,初始数据如下:
mysql replace into 缺陷的解决方案

使用replace into 新增或修改数据:

replace into role (role_id, role_name) values (1, '普通用户4')

执行后,role表的数据:
mysql replace into 缺陷的解决方案
我们发现role_create_time与role_update_time并没有在修改条件中,但恢复到了默认值。这样,在使用replace into 就会有隐患。

替代方案:
使用on duplicate key做数据新增或修改,类似oracle的merge into
我们再使用on duplicate key修改“普通用户”这条记录
编写sql:

insert into role (role_id, role_name) values (2, '普通用户4') on duplicate key update role_name = '普通用户4'

查看数据,id为2的两个时间并没有恢复至默认值
mysql replace into 缺陷的解决方案

上一篇:参数绑定:数组类型参数绑定-----集合类型参数绑定----格式类型转换(日期) ----@DateTimeFormat


下一篇:vue 实现基础的拖拽排序