今天在做批量更新时,想起之前遇到的一个问题。
Q:在Innodb中开启一个事务,然后Update 不带where,是否会锁定全表呢?
答案是肯定的。
这里也记录一下如何避免这种情况,可以再Mysql中开启安全模式避免遗漏where产生的问题。
============================================
1.什么是安全模式
在mysql中,如果在update和delete没有加上where条件,数据将会全部修改。不只是初识mysql的开发者会遇到这个问题,工作有一定经验的工程师难免也会忘记写入where条件。为了避免失误造成的数据全部修改和删除,可开启mysql的安全模式。
3.查看安全模式
show variables like "%safe%"
sql_safe_updates就是数据库的 安全模式。默认问关闭状态。
开启数据库可以对数据进行一些不当操作的保护。
比如:在使用update,delete操作的时候没有where条件或者limit条件的时候,就会容易误操作整张表的数据。
安全模式也是属于mysql系统变量的,所以查看的时候可以用variable
2.设置安全模式
上面查询命令实例表示当前mysql处于安全模式打开的状态。
set sql_safe_updates=1; //安全模式打开状态
set sql_safe_updates=0; //安全模式关闭状态
3.update、delete操作
update
(1)无where条件的update,操作失败,会提示需要使用where条件作为主键。
(2)无where条件但是有limit的update,操作成功,虽然没有where条件,但是加入了limit限制。
(3)使用非索引字段作为条件进行更新,操作失败,因为条件字段不是索引字段并且没有加入limit限制。
(4)使用非索引字段作为条件并且加入limit进行更新,操作成功,虽然条件字段不是索引字段,但是有加入limit限制,所以执行成功。
(5)使用索引字段作为条件并且不加入limit进行更新,操作成功,虽然没有加入limit限制,但是条件字段为索引字段,所以执行成功。
delete
(1)无where条件的delete,操作失败,没有where条件
(2)非索引键进行条件删除,操作失败
(3)使用索引键并且不加limit限制进行删除。操作成功
(4)加入limit但是不使用where条件删除。操作失败,因为没有加入where检索条件。
————————————————
版权声明:本文为CSDN博主「卧云港」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接: