replace into 实现原理是:如果新插入行的主键或唯一键在表中已经存在,则会删除原有记录并插入新行;如果在表中不存在,则直接插入。这样就会存在缺陷,如果某个字段有默认值,在使用replace into做数据修改时会将默认值的字段恢复到默认值,造成数据丢失。
初始数据
使用replace into 新增或修改数据:
replace into role (role_id, role_name) values (1, '普通用户4')
执行后数据
role_create_time与role_update_time并没有在修改条件中,但更新了。这样,在使用replace into 就会有隐患。
替代方案
使用on duplicate key
做数据新增或修改,类似oracle的 merge into
-- 使用on duplicate key修改“普通用户”这条记录 insert into role (role_id, role_name) values (2, '普通用户4') on duplicate key update role_name = '普通用户4'
查看数据
id为2的两个时间并没有更新