排名前5的SQL悲剧中肯定有:

delete from table t /* where true */;
update t set col='new_value' /* where true */

由于漏掉where条件或者拼接SQL后的where条件部分为true,这时整个表都被删除/更新了...
在使用mysql的应用中,避免此类低级错误的方法:
1、应用仔细检查(小心才能使得万年船啊~)
2、开启sql_safe_updates 
mysql> set sql_safe_updates=1;
Query OK, 0 rows affected (0.00 sec)
mysql> delete from t;
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 from t 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源码介绍一下sql_safe_updates的逻辑
sql_safe_update开启后,mysql server层在调用mysql_update/mysql_delete时对where和limit进行判断后决定是否执行,代码调用关系:
dispatch_command
|->mysql_parse|->mysql_execute_command->mysql_update/mysql_delete

mysql_update:(sql/sql_update.cc)
当where条件中column没有索引可用且无limit限制时会拒绝更新
  1. /* If running in safe sql mode, don't allow updates without keys */if (table->quick_keys.is_clear_all()){thd->server_status|=SERVER_QUERY_NO_INDEX_USED;if (safe_update && !using_limit){my_message(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE,ER(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE), MYF(0));goto err;}}

mysql_delete中:(sql/sql_delete.cc)
当where条件为常量或者为空,或者where条件中column没有索引可用且无limit限制时拒绝删除

  1. const_cond= (!conds || conds->const_item());safe_update=test(thd->variables.option_bits & OPTION_SAFE_UPDATES);if (safe_update && const_cond){my_message(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE,ER(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE), MYF(0));DBUG_RETURN(TRUE);}.../* If running in safe sql mode, don't allow updates without keys */if (table->quick_keys.is_clear_all()){thd->server_status|=SERVER_QUERY_NO_INDEX_USED;if (safe_update && !using_limit){delete select;free_underlaid_joins(thd, select_lex);my_message(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE,ER(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE), MYF(0));DBUG_RETURN(TRUE);}}

PS: update在有limit时是可以执行更新的,而delete严格一些,只要where条件为常量或者为空是会被拒绝的,如:

mysql> update t set str='hello' where 1=1 limit 1;
Query OK, 0 rows affected (0.00 sec)
mysql> delete from t where 1=1 limit 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

不知道这是基于怎样的考虑...

不过开启sql_safe_updates后,update和delete在修改数据时,如果不带limit,需要where条件可以走索引,否则会报错.

转载于:https://www.cnblogs.com/duanxz/p/3891540.html

mysql sql_safe_updates 分析相关推荐

  1. Mysql元数据分析

    Mysql元数据分析 一.information_schema库 information_schema库中的表,保存的是Mysql的元数据. 官网元数据表介绍 InnoDB相关的表介绍 库中有表: + ...

  2. MYSQL:explain分析

    mysql explain分析 通过explain可以知道mysql是如何处理语句,分析出查询或是表结构的性能瓶颈.通过expalin可以得到: 1. 表的读取顺序 2.表的读取操作的操作类型 3.哪 ...

  3. MySQL索引分析和优化(转)

    MySQL索引分析和优化(转) 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记 录,直至找到符 ...

  4. mysql genlog 分析_Mysq性能分析 —— Genral log(普通日志)与 Slow log(慢速日式)...

    对Mysql进行深入的分析对于发现mysql性能瓶颈和寻找优化策略是十分必要的. 我们可以从不同的粒度上对Mysql进行分析:可以整体分析服务器,或者检查单个查询或批查询. 通过分析,我们得到的如下信 ...

  5. MySQL性能分析及explain的使用

    MySQL性能分析及explain用法的知识是本文我们主要要介绍的内容,接下来就让我们通过一些实际的例子来介绍这一过程,希望能够对您有所帮助. 1.使用explain语句去查看分析结果 如explai ...

  6. MySQL 索引分析除了 EXPLAIN 还有什么方法?

    作者 | adrninistrat0r 责编 | 夕颜 出品 | CSDN(ID:CSDNnews) 前言 对于非数据库开发人员而言,难以对MySQL源码进行分析或调试,接近一个黑盒,但MySQL提供 ...

  7. (3.13)mysql基础深入——mysql日志分析工具之mysqlsla【待完善】

    (3.13)mysql基础深入--mysql 日志分析工具之mysqlsla 关键字:Mysql日志分析工具.mysqlsla 常用工具 [1]mysqldumpslow:官方提供的慢查询日志分析工具 ...

  8. MySQL 性能分析 之 联合索引(复合索引)实践分析

    MySQL 性能分析 之 联合索引(复合索引)实践分析 作为开发者,大家都知道,一个服务器.一个数据库的性能是项目的重中之重,后台架构.写法与数据库设计的好坏往往直接影响到整个项目的性能. 索引:是当 ...

  9. php mysql索引原理_加速PHP动态网站 关于MySQL索引分析优化

    本文主要讲述了如何加速动态网站的MySQL索引分析和优化. 一.什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第 ...

最新文章

  1. 通用权限管理系统组件中简易员工档案管理模块参考
  2. 快速融入新团队的一点个人体会
  3. 驱动备份工具哪个好_大庆seo排名优化推广公司工具哪个好
  4. ddrelease64 黑苹果_High Sierra 黑苹果构建 微星X99A GAMING PRO CARBON+i7 6800k+GTX1070
  5. 虚拟DOM - React的骨干
  6. linux下的文档处理及tar命令
  7. [2010-9-8]
  8. 动态路由之RIP协议、Bellman-Ford算法
  9. 【洛谷P4219】【BJOI2014】—大融合(线段树合并)
  10. 山东大学舆情分析系统项目结题总结
  11. 卸载驱动、安装CUDA及CUDNN
  12. INT 10H 中断简介
  13. 科学计算IED--Anaconda软件基础操作
  14. FTPC 在制品跟踪(WIP Tracking)对象
  15. 2021年中国医药工业经济运行现状及行业发展建议:主营业务收入、利润总额整体递增,建议加大监管,引导产业良性发展[图]
  16. 单片机C语言学习(菜鸟入门)
  17. 关于SDRAM存储器
  18. 自定义组件-behaviors
  19. NIST宣布推出前4种抗量子加密算法
  20. 同步电机与异步电机的区别

热门文章

  1. docker内外连通ros_docker容器内的ros外设使用与远程配置
  2. java求职_Java 求职怎么积累知识才可以找到工作
  3. 各种树:trie树、B树、B-树、B+树、B*树
  4. 思想开放-学数学之人必备的特质(转载)
  5. 2019年东莞特长生 散步
  6. 2048(lj模拟)
  7. 洛谷 P2935 [USACO09JAN]最好的地方Best Spot
  8. 点击事件为什么会失效_耐高温润滑油脂为什么会失效?
  9. sketchup 图片转模型_你应该知道的那些 Sketchup 实用快捷键和使用技巧!
  10. 大学有哪些专业python_python就业方向有哪些?