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)

2:查看全局级别系统变量sql_safe_updates的值

mysql> show global variables like 'sql_safe_updates';

+------------------+-------+

| Variable_name    | Value |

+------------------+-------+

| sql_safe_updates | OFF   |

+------------------+-------+

1 row in set (0.00 sec)

 

mysql> select @@global.sql_safe_updates;

+---------------------------+

| @@global.sql_safe_updates |

+---------------------------+

|                         0 |

+---------------------------+

1 row in set (0.00 sec)

系统变量sql_safe_updates的设置

#设置会话级别的系统变量

mysql> set sql_safe_updates=1;

Query OK, 0 rows affected (0.00 sec)

#设置全局级别的系统变量

mysql> set global sql_safe_updates=1;

Query OK, 0 rows affected (0.00 sec)

如果要设置全局级别的系统变量sql_safe_updates,最好在配置文件my.cnf中设置,这样就能避免MySQL重启后,SQL命令设置的sql_safe_updates系统全局变量失效。

实验测试案例

UPDATE语句测试

1: 没有WHERE条件。

mysql> update shop set price=price*1.5;

ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

mysql> 

2: 没有WHERE条件,但是有LIMTI限制条件

如下测试所示,没有WHERE条件,但是有LIMIT限制的话,SQL也是可以执行的。

mysql> update shop set price=price*1.5 limit 5;

Query OK, 5 rows affected (0.05 sec)

Rows matched: 5  Changed: 5  Warnings: 0

3: 有WHERE条件,但是WHERE条件的列没有索引可用

mysql> show index from shop\G;

*************************** 1. row ***************************

        Table: shop

   Non_unique: 0

     Key_name: PRIMARY

 Seq_in_index: 1

  Column_name: article

    Collation: A

  Cardinality: 931203

     Sub_part: NULL

       Packed: NULL

         Null: 

   Index_type: BTREE

      Comment: 

Index_comment: 

*************************** 2. row ***************************

        Table: shop

   Non_unique: 0

     Key_name: PRIMARY

 Seq_in_index: 2

  Column_name: dealer

    Collation: A

  Cardinality: 931203

     Sub_part: NULL

       Packed: NULL

         Null: 

   Index_type: BTREE

      Comment: 

Index_comment: 

*************************** 3. row ***************************

        Table: shop

   Non_unique: 1

     Key_name: shop__price

 Seq_in_index: 1

  Column_name: price

    Collation: A

  Cardinality: 1877

     Sub_part: NULL

       Packed: NULL

         Null: 

   Index_type: BTREE

      Comment: 

Index_comment: 

3 rows in set (0.00 sec)

 

ERROR: 

No query specified

 

mysql> update shop set price = price * 1.5 where dealer='K';

ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

4: 有WHERE条件,但是WHERE条件列没有索引 + LIMIT限制

mysql> update shop set price = price * 1.5 where dealer='K' limit 1000;

Query OK, 1000 rows affected (0.13 sec)

Rows matched: 1000  Changed: 1000  Warnings: 0

5:有WHERE条件的UPDATE,而且字段有索引

mysql> update shop set price = price * 1.5 where article=6156;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1  Changed: 1  Warnings: 0

 

mysql> 

6:有WHERE条件,但是WHERE条件为常量

mysql>  update shop set price = price * 1.5 where 1=1;

ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

7:有WHERE条件,但是WHERE条件为常量+LIMIT

mysql> update shop set price = price * 1.5 where 1=1 limit 10;

Query OK, 10 rows affected (0.00 sec)

Rows matched: 10  Changed: 10  Warnings: 0

DELETE语句测试

1: DELETE语句没有WHERE条件

mysql> delete from shop;

ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

mysql>

2:  DELETE语句没有WHERE条件+ LIMIT

mysql> delete from shop limit 10;

ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

mysql> 

3:DELETE语句有WHERE条件,而且查询条件的字段有索引

mysql> delete from shop where article =6156;

Query OK, 1 row affected (0.01 sec)

 

mysql>

4:DELETE语句有WHERE条件,而且查询条件的字段有索引 +LIMIT

mysql> delete from shop where article< 2000 limit 1000;

Query OK, 1000 rows affected (0.02 sec)

 

mysql>

5:DELETE语句有WHERE条件,但是查询条件的字段没有索引

mysql> delete from shop where dealer='K';

ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

mysql>  

6:DELETE语句有WHERE条件,但是查询字段没有索引 +LIMIT语句

mysql> delete from shop where dealer='K' limit 20;

Query OK, 20 rows affected (0.05 sec)

 

mysql> 

7:DELETE语句有WHERE条件,但是WHERE条件为常量

mysql>  delete from shop where 1=1;

ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

mysql>

8:DELETE语句有WHERE条件,但是WHERE条件为常量 +LIMIT

mysql> delete from shop where 1=1 limit 10;

ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

mysql>

如上测试的实验结果,总结出来如下所示.至于是否要开启这个系统变量,需要结合实际情况,并且和开发人员、项目管理人员一起协商才行。

操作

Delete

Update

NO WHERE

No

No

NO WHERE + LIMIT

No

Yes

WHERE KEY

Yes

Yes

WHERE KEY + LIMIT

Yes

Yes

WHERE NOKEY

No

No

WHERE NOKEY+ LIMIT

Yes

Yes

WHERE CONSTANT

No

No

WHERE CONSTANT + LIMIT

No

Yes

MySQL系统变量sql_safe_updates总结的更多相关文章

  1. mysql系统变量查询

    mysql系统变量包括全局变量(global)和会话变量(session),global变量对所有session生效,session变量包括global变量.mysql调优必然会涉及这些系统变量的调整 ...

  2. mysql 系统变量和session变量

    mysql系统变量包括全局变量(global)和会话变量(session),global变量对所有session生效,session变量包括global变量.mysql调优必然会涉及这些系统变量的调整 ...

  3. MySQL系统变量auto_increment_increment与auto_increment_offset学习总结

    在MySQL中,系统变量auto_increment_increment与auto_increment_offset是与自增列相关的两个参数变量.在官方文档中,将其划分为Replication Mas ...

  4. mysql系统变量与状态变量

    一.系统变量分为全局系统变量和会话系统变量:有些变量既是全局系统变量,有些变量只有全局的,有些变量只有会话的. .变量的查询: show global variables like 'log' \G; ...

  5. MySQL系统变量 sql_mode 详解

    转载自:http://tech.it168.com/a2012/0822/1388/000001388401_all.shtml MySQL数据类型:SQL_MODE设置不容忽视 SQL_MODE可能 ...

  6. 可遇不可求的Question之MySQL系统变量interactive_timeout 与 wait_timeout 篇

    mysql>show variables like '%timeout'; 打印结果如下: +----------------------------+-------+ | Variable_n ...

  7. MySQL系统变量配置基础

    本文出处:http://www.cnblogs.com/wy123/p/6595556.html MySQL变量的概念 个人认为可以理解成MySQL在启动或者运行过程中读取的一些参数问题,利用这些参数 ...

  8. mysql系统变量

    http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html Table 5.2 System Variable Summar ...

  9. 查看MySQL系统变量的命令

    用了好长时间mysql,却没有用心记住一些有用的东西,加油! mysql> SHOW VARIABLES; +---------------------------------+-------- ...

随机推荐

  1. redis缓存清除

    1.redis根目录调出命令行(cmd) 2.登录redis:redis-cli -h 127.0.0.1 -p 6379 3.查看所有key值:keys * 4.删除指定索引的值:del key 5 ...

  2. 百度地图点击地图显示地址详情的默认方法怎么关闭,去掉百度地图api图标信息

    去掉百度地图api图标信息 调用百度地图API时,如果想去掉百度的logo,只需要在css里设置: <style> .anchorBL{display:none} </style&g ...

  3. 阿里如何实现海量数据实时分析技术-AnalyticDB

    导读:随着数据量的快速增长,越来越多的企业迎来业务数据化时代,数据成为了最重要的生产资料和业务升级依据.本文由阿里AnalyticDB团队出品,近万字长文,首次深度解读阿里在海量数据实时分析领域的多项 ...

  4. BASE64编码原理分析脚本实现及逆向案例

    在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理你又了解多少?今天小编带大家了解一下Base64编码原理分析脚本实现及逆向案例的相关内容.   01编码由来 数 ...

  5. String字符串创建与存储机制

    Java内存可以粗略的区分为堆内存(Heap)和栈内存(Stack),堆中存放的是对象实例,而栈中存放的则是方法调用过程中的局部变量或引用等. 在Java语言中,字符串的生命与初始化有如下两种方式: ...

  6. Java相关面试题总结+答案(二)

    [容器] 18. Java 容器都有哪些? 19. Collection 和 Collections 有什么区别? Collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法, ...

  7. 《白帽子讲Web安全》- 学习笔记

    一.为何要了解Web安全 最近加入新公司后,公司的官网突然被Google标记为了不安全的诈骗网站,一时间我们信息技术部门成为了众矢之的,虽然老官网并不是我们开发的(因为开发老官网的前辈们全都跑路了). ...

  8. ASP.NET Core中使用GraphQL - 第九章 在GraphQL中处理多对多关系

    ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...

  9. springboot~Mongodb的集成与使用

    说说springboot与大叔lind.ddd的渊源 Mongodb在Lind.DDD中被二次封装过(大叔的.net和.net core),将它当成是一种仓储来使用,对于开发人员来说只公开curd几个 ...

  10. 通用查询设计思想(2)- 基于ADO.Net的设计

    不少公司用的是ADO.NET的访问方式,估计不少朋友对于sql的拼写真是深恶痛绝,在没有一个封装足够好的底层的项目,特别是经过许多人接手之后,代码那叫一个惨不忍睹,本文借助[通用查询设计思想]这篇文章 ...