MySQL系统变量sql_safe_updates总结

 

在MySQL中,系统变量sql_safe_updates是个非常有意思的系统变量,在Oracle和SQL Server中都没有见过这样的参数或功能。如果这个系统变量设置为1的话,意味着update与delete将会受到限制。个人臆测,之所以提供这个功能,一方面是要避免出现更新或删除数据时,忘记添加WHERE条件,导致数据被误更新或误删的情况。相信不少人都由于疏忽或大意,遇到过这种情况; 另外一方面也是为了提高SQL性能考虑,避免DELETE与UPDATE语句的WHERE条件不走索引的情况。默认情况下,系统变量sql_safe_updates是禁用的。我们下面来简单测试、了解一下这个系统变量的细节问题

 

系统变量sql_safe_updates分会话级别和全局级别。可以动态修改。默认是关闭(值为0)。具体参考官方文档。

 

系统变量的查看

 

注意事项1:show variables优先显示会话级变量的系统变量值,如果这个系统变量没有会话级别的值,则显示全局级系统变量的值,当然最清晰的方式就是加上GLOBAL或SESSION关键字来区别。

注意事项2:@@GLOBAL.var_name、@@SESSION.var_name 、@@LOCAL.var_name 。如果在变量名前没有级别限定符,将优先显示会话级的值。

 

1:查看会话级别系统变量sql_safe_updates的值

 

mysql> show variables like 'sql_safe_updates';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| sql_safe_updates | ON    |
+------------------+-------+
1 row in set (0.01 sec)
 
mysql> show session variables like 'sql_safe_updates';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| sql_safe_updates | ON    |
+------------------+-------+
1 row in set (0.00 sec)
 
mysql> 
mysql> select @@session.sql_safe_updates;
+----------------------------+
| @@session.sql_safe_updates |
+----------------------------+
|                          1 |
+----------------------------+
1 row in set (0.00 sec)
 
mysql> select @@sql_safe_updates;
+--------------------+
| @@sql_safe_updates |
+--------------------+
|                  1 |
+--------------------+
1 row in set (0.00 sec)

相关文章: