replace into 实现原理是:如果新插入行的主键或唯一键在表中已经存在,则会删除原有记录并插入新行;如果在表中不存在,则直接插入。这样就会存在缺陷,如果某个字段有默认值,在使用replace into做数据修改时会将默认值的字段恢复到默认值,造成数据丢失。
如下所示,假设有一个表role,其中role_create_time与role_update_time默认值为当前时间,初始数据如下:
使用replace into 新增或修改数据:
replace into role (role_id, role_name) values (1, '普通用户4')
执行后,role表的数据:
我们发现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的两个时间并没有恢复至默认值