Skip to content

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), KEY k_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子句。

上一篇:explicit_defaults_for_timestamp | 下一篇:auto_increment_increment

Clone this wiki locally