MySQL 系统参数 sql_safe_updates 小结

前一段时间,公司某个项目组某个项目因为失误,出现了一个严重 bug,动态 SQL 导致没有 where 条件,就把数据库某张表里面的数据全部更新了,虽然事后 DBA 同学很给力的恢复了,但是运维的同学讨论,让所有的项目都不许写动态 SQL,必须根据 ID 更新,并写了一个 sonar 插件,扫描代码,发现有动态 SQL 就报 bug,不过还好暂时没有强制要求改,个人认为如果强制要求,这不就是典型的因噎废食吗?没有动态 SQL,这代码量得增加多少?我们研发要不要按照代码量算钱?前一段时间,看《即刻时间》丁奇(原名林晓斌)的 《MySQL 实战 45 讲》里面有一句话关于 sql_safe_updates 的知识点一笔带过,小小研究一下,刚好可以解决这个问题,这是一个小结。 作用:防止忘记添加 WHERE 条件,导致数据被误更新或误删的情况和另外为了提高 SQL 性能,避免更新或删除的时候 WHERE 条件不走索引的情况;不过默认值是:关闭(值为0),所以可能更多的防止忘记添加 WHERE 条件吧,另外这个参数分为会话级别和全局级别。 查看 sql_safe_updates 的值和修改 show variables like ‘sql_safe_updates’; — 会话 show global variables like ‘sql_safe_updates’; — 全局 set sql_safe_updates=1; — 会话 set global sql_safe_updates=1; — 全局 具体的测试比较简单,就不一张张的贴图了,直接写结论了,大家可以自己测试一下就好了 操作 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 其中 KEY 不仅是主键,同样也包括索引字段,CONSTANT 表示 where 1= 1(有些程序员的知识没有更新喜欢这么写,其实可以不用的),Yes 是可以,No 是不可以。 ...

October 27, 2019 · 1 min · 110 words · Bridge Li