执行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