MYSQL安全模式\"sql_safe_updates\"设置update和delete不带where的操作限制

前言

  在数据库操作中,如果在update和delete没有加上where条件,数据将会全部修改。

  不只是初识mysql的开发者会遇到这个问题,工作有一定经验的开发者有时难免也会忘记写入where条件。

  今天,一个同事就发生了这种情况,手抖清空了线上一个table的所有数据(ps:这是要准备删库跑路的节奏???)。

  在恢复完数据后,为了以后避免失误造成的数据全部修改或删除,设置开启mysql的安全模式。

解决方案

  首先查看安全模式是否开启(OFF关闭,ON打开):

mysql> show variables like \'sql_safe_updates\';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| sql_safe_updates | OFF    |
+------------------+-------+
row in set (0.00 sec)

  打开/关闭(global全局生效 ):

  set global sql_safe_updates=1;

  set global sql_safe_updates=0;

  安全模式设置成功后如果再次执行全表update/delete,会报错

DELETE from m_test
error : You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. 

总结

  如果开启了安全模式后

  update语句必须满足如下条件之一才能执行成功

    1)使用where子句,并且where子句中列必须为prefix索引列

    2)使用limit

    3)同时使用where子句和limit(此时where子句中列可以不是索引列)

  delete语句必须满足如下条件之一才能执行成功

    1)使用where子句,并且where子句中列必须为prefix索引列

    2)同时使用where子句和limit(此时where子句中列可以不是索引列)