mysql update致命性更新的回滚方式

执行update语句的时候,有的时候一个不小心,where条件没写好,本想更新几条记录,但是灾难性地更新了整个表,而且想恢复,恢复代价极高。这种灾难性的更新,一旦发生在生产环境,那将是灾难性后果。轻则删库跑路被开除,重则吃不了兜着走,简直是“恐怖”性,“灾难”性事件!

一、下面列举一些常见的容易写错的写法

(1)update test set is_del=1 where 13456;--(本来想写成:  where id=13456)

(2)update test set is_del=1 and id in (3,4);--(本来想写成:  set is_del=1 where id in (3,4))

 (3) update test set a='aa' and b='bb' where id=123456;--(本来想写成:  set a='aa',b='bb' where id =123456 )

那么,怎么去避免这种情况呢?

二、解决办法

最笨最傻的办法是开启事务,看执行了多少条,再决定是提交还是会滚。废话不多说,上操作图

错误则回滚:

正确则提交:

三、第二个例子的解释

update meal_record set is_del=1 and id in (3,4);
即:update meal_record set is_del=( 1 && (id in (3,4)) );
(1)if id=3,4时,(id in (3,4))=1(true), 1&&1=1,即:
update meal_record set is_del=1 where id in (3,4);

(2)if id!=3,4时,(id in (3,4))=0(false), 1&&0=0
update meal_record set is_del=0 where id not in (3,4);
但是,如果update set更新多想,多个待更新的字段,应该用,隔开而不是and

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值