sql_safe_updates - xiaoboluo768/qianjinliangfang GitHub Wiki
- 如果设置为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