MySQL误写DELETE条件致全表删除是否为BUG?未报语法错原因咨询
问题结论
这不属于MySQL的BUG,完全符合SQL的语法逻辑和运算优先级规则。
具体原因解释
- 首先是运算符优先级规则:MySQL中比较运算符
=的优先级高于逻辑运算符OR,错误写法DELETE FROM table_name WHERE id = 5 OR 10 OR 15 OR 20 OR 25会被MySQL按照优先级自动拆解为如下逻辑:WHERE (id = 5) OR (10) OR (15) OR (20) OR (25) - 其次是MySQL的布尔值判断规则:所有非0的整数在布尔判断场景下都会被识别为
TRUE,所以上面拆解后的条件里10、15、20、25这几个常量单独作为判断项时,返回结果永久为真。 - 最终整个WHERE条件等价于
任意布尔值 OR TRUE OR TRUE OR TRUE OR TRUE,不管id = 5的判断结果是否成立,整个WHERE条件的返回结果永远为真,相当于触发了全表匹配规则,自然会删除所有表数据。
为什么没有抛出语法错误
该写法本身完全符合SQL的语法规范,不存在语法错误,只是运行逻辑和使用者的预期不符,所以MySQL不会抛出报错。
优化建议
针对多值匹配的场景,更推荐使用IN语法书写,既更简洁也能避免手滑漏写字段的问题,正确写法如下:
DELETE FROM table_name WHERE id IN (5,10,15,20,25)
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

