开发和维护系统的过程中,不管是程序员还是 DBA ,都有可能会执行了一些没有带过滤条件的 update 或 delete 语句,导致全表数据被误改误删,系统的业务逻辑无法正常运行。
针对这种情况,MySQL 提供了一个 sql_safe_updates 参数,这个参数配置后就可以让不带过滤条件的 update/delete 语句执行失败。
sql_safe_updates 参数的默认值是 0,表示不开启安全更新,设置为 1 则表示开启安全更新。
开启安全更新后,update 语句要正常执行的话,必须满足以下三种情况之一:
- 使用了 where 子句,并且 where 子句的查询条件带有索引
- 使用了 limit 子句
- 上面两种情况同时存在
delete 语句要正常执行的话,则更加严格,不仅要求使用 where 子句,并且 where 子句的查询条件必须带有索引,而且还必须加上 limit 子句。
开启安全更新后,以下三种情况的 SQL 语句都不会被 MySQL 执行:
- update 语句没有加 where 条件
- update 语句加了 where 条件,并且 where 条件字段没有设置索引
- delete 语句没有加 where 条件,或者 where 条件字段没有设置索引