MySQL系统变量sql_safe_updates总结
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总结的更多相关文章
- mysql系统变量查询
mysql系统变量包括全局变量(global)和会话变量(session),global变量对所有session生效,session变量包括global变量.mysql调优必然会涉及这些系统变量的调整 ...
- mysql 系统变量和session变量
mysql系统变量包括全局变量(global)和会话变量(session),global变量对所有session生效,session变量包括global变量.mysql调优必然会涉及这些系统变量的调整 ...
- MySQL系统变量auto_increment_increment与auto_increment_offset学习总结
在MySQL中,系统变量auto_increment_increment与auto_increment_offset是与自增列相关的两个参数变量.在官方文档中,将其划分为Replication Mas ...
- mysql系统变量与状态变量
一.系统变量分为全局系统变量和会话系统变量:有些变量既是全局系统变量,有些变量只有全局的,有些变量只有会话的. .变量的查询: show global variables like 'log' \G; ...
- MySQL系统变量 sql_mode 详解
转载自:http://tech.it168.com/a2012/0822/1388/000001388401_all.shtml MySQL数据类型:SQL_MODE设置不容忽视 SQL_MODE可能 ...
- 可遇不可求的Question之MySQL系统变量interactive_timeout 与 wait_timeout 篇
mysql>show variables like '%timeout'; 打印结果如下: +----------------------------+-------+ | Variable_n ...
- MySQL系统变量配置基础
本文出处:http://www.cnblogs.com/wy123/p/6595556.html MySQL变量的概念 个人认为可以理解成MySQL在启动或者运行过程中读取的一些参数问题,利用这些参数 ...
- mysql系统变量
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html Table 5.2 System Variable Summar ...
- 查看MySQL系统变量的命令
用了好长时间mysql,却没有用心记住一些有用的东西,加油! mysql> SHOW VARIABLES; +---------------------------------+-------- ...
随机推荐
- spring boot 文件上传大小限制
错误信息 : Spring Boot:The field file exceeds its maximum permitted size of 1048576 bytes. 解决方法一:在启动类添加如 ...
- Ntaub表单开发入门系列 (一)
此系列文章通过虚构场景介绍Ntaub表格开发流程.示例假设某公司人力部门要制定招聘计划,要求各部门按月提交招聘需求,招聘需求需经人力总监和公司总经理审批. 软件可以从http://www.ntaub. ...
- mssql sqlserver 三种数据表数据去重方法分享
摘要: 下文将分享三种不同的数据去重方法数据去重:需根据某一字段来界定,当此字段出现大于一行记录时,我们就界定为此行数据存在重复. 数据去重方法1: 当表中最在最大流水号时候,我们可以通过关联的方式为 ...
- 快速构建H5单页面切换应用
在Web App和Hybrid App横行的时代,为了拥有更好的用户体验,单页面应用顺势而生,单页面应用简称`SPA`,即Single Page Application,就是只有一个HTML页面的应用 ...
- 宝塔面板设置腾迅COS自动备份网站
之前写了如何配置腾迅云COS并挂载到服务器中,今天看到宝塔面板中有腾迅云COS的插件,不过研究了下,只是将COS绑定在宝塔面板中,不能自动备份,需要用到宝塔的计划任务功能 1.下载腾迅云COS插件 2 ...
- 《深入理解 JVM 虚拟机》 --- 看书笔记
1.JVM 内存溢出 1.堆溢出:堆要不断的创建对象,如果避免了垃圾回收来清除这些对象,就会产生JVM内存溢出.一般手段是通过内存映像分析工具对Dump出来的堆转储快照进行分析,分清楚到底是内存泄露还 ...
- 使用Update Strategy组件无法进行delete操作
问题: Update Strategy组件根据字段值对目标表进行DD_DELETE操作时失效 同时,session log中报错:Target table [XXXXXXXX] does not al ...
- Java基础--JDK的安装和配置
一.Java平台简述 1.1 Java语言简介 Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两 ...
- .NET Core微服务之基于Polly+AspectCore实现熔断与降级机制
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.熔断.降级与AOP 1.1 啥是熔断? 在广义的解释中,熔断主要是指为控制股票.期货或其他金融衍生产品的交易风险,为其单日价格波动幅度 ...
- Python爬虫入门教程 48-100 使用mitmdump抓取手机惠农APP-手机APP爬虫部分
1. 爬取前的分析 mitmdump是mitmproxy的命令行接口,比Fiddler.Charles等工具方便的地方是它可以对接Python脚本. 有了它我们可以不用手动截获和分析HTTP请求和响应 ...