-
Notifications
You must be signed in to change notification settings - Fork 55
sql_safe_updates
xiaoboluo768 edited this page Jun 14, 2020
·
2 revisions
- 如果设置为1,MySQL将禁止执行在WHERE子句或LIMIT子句中不带索引列条件的UPDATE或DELETE语句。即,UPDATE和DELETE语句必须有一个WHERE子句,且where条件列必须使用能使用到索引,如果不能使用索引时还必须另外加一个LIMIT子句,或两者都有更好。否则不允许执行
- 示例(set sql_safe_updates=1;):
- 表结构:CREATE TABLE
sbtest1
(id
int(10) unsigned NOT NULL AUTO_INCREMENT,k
int(10) unsigned NOT NULL DEFAULT '0',c
char(120) COLLATE utf8_bin NOT NULL DEFAULT '',pad
char(60) COLLATE utf8_bin NOT NULL DEFAULT '', PRIMARY KEY (id
), KEYk_1
(k
) ) ENGINE=InnoDB; 留意这里的id,k和c列,id是主键,k有索引,c列无索引 - delete from sbtest1 where c='17962233561-27816105035-66206962467-49296211054-73206072617-48858000511-36677164809-97422115612-64772317024-51197779187'; 不允许执行,带where条件,但条件列无索引
- delete from sbtest1 where c='17962233561-27816105035-66206962467-49296211054-73206072617-48858000511-36677164809-97422115612-64772317024-51197779187' limit 1; 允许执行,带where条件,条件列无索引,但多加一个limit子句即可执行
- delete from sbtest1; 不允许执行,不带where条件
- delete from sbtest1 limit 1; 不允许执行,不带where条件
- delete from sbtest1 where id=1; 允许执行,id列为主键,不需要额外加limit子句
- delete from sbtest1 where k=1; 允许执行,k列有辅助索引,不需要额外加limit子句
- 对于update语句在设置sql_safe_updates=1时,也跟delete表现完全一致,只看where子句有没有索引,有索引就允许执行,无索引就不允许执行,除非再加上limit子句。
- 表结构:CREATE TABLE
- 示例(set sql_safe_updates=1;):
上一篇:explicit_defaults_for_timestamp | 下一篇:auto_increment_increment
-
本 WIKI 包含了《千金良方--MySQL 性能优化金字塔法则》一书的代码段加粗命令行命令和SQL语句文本、以及4个附录内容,其中:
- 代码段和高清图单独整理为一个系列文档,如下:
- 每个附录都各自整理成了一个小系列文档,如下:
-
《千金良方--MySQL 性能优化金字塔法则》 一书的作者信息如下:
- 李春、罗小波、董红禹
-
联系人QQ:309969177
-
提示:
-
郑重声明:本WIKI仓库中的资料为电子工业出版社与本书的三位作者共同授权开源,为了在方便大家的同时,避免不必要的纠葛,任何商业与非商业的引用、转载,麻烦大家注明出处,谢谢配合!