mysql(五)mysql replace into 缺陷的解决方案

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的两个时间并没有恢复至默认值
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值