首页 > 技术文章 > 避免生产环境执行更新删除语句忘记加where条件的解决方案

emaes 2020-04-13 17:24 原文

今天在生产环境上执行update语句时忘记添加where语句,造成了整张都被更新,还好这张表数据量不大,只有上百条数据,最后在平台上一条一条的改数据,工作量不算太大,后来反思如果这张表有上千条上万条数据该怎么办,所以在反思解决方法。
从源头出发,为什么会出现忘记添加where语句,能不能从源头解决方法。
假设我们要更新一张表中的一条数据,我们可以添加上事务:
1、执行查询语句,这条数据存在:

SELECT * FROM cht_store WHERE CHT_STORE_ID='111'

2、执行事务,start也可以改成begin:

START TRANSACTION;

UPDATE cht_store SET CHT_STORE_ID='000' WHERE CHT_STORE_ID='111';

--COMMIT;#事务提交

你看到后台显示受影响1行,说明添加你写的where语句,此时执行查询语句会发现数据已经"被更改"。
3、如果你忘记添加where语句,会发现受影响N多行,此时你可以执行回滚该条数据:

ROLLBACK;#事务回滚

此时你再执行查询语句会发现数据被回滚了。
4、如果更新的数据与你预想的数据一致,此时事务就可以提交了,执行commit语句即可:

COMMIT;#事务提交

5、事务自动提交

set autocommit=1

是设置事务自动提交的命令,这个命令会将这个线程的更新自动提交掉。这意味着如果你只执行一个select语句,这个事务就启动了,并且会自动提交。
mysql中查看当前自动提交状态的命令为:show VARIABLES like ‘autocommit’; 如下value为on代表是自动提交已经打开。

推荐阅读