
“我明明写了条件,怎么全表都被更新了?!” “更离谱的是,MySQL 还没报错,执行成功了!”
这不是段子,这是今天真实发生在我身上的故事。
事情是这样的:
一位开发小哥想更新一张任务调度表,将某些的任务状态改成 -2,于是他写了这么一条 SQL:
UPDATE wl_quotes_scheduler.xxl_job_info
SET trigger_status =-2 AND job_group NOTIN(61,58);执行完一看,执行成功:

我们来把这条 SQL 拆开看:
SET trigger_status =-AND job_group NOTIN(,)注意,这里用了一个 AND,但它不是在 WHERE 子句里,而是在 SET 子句里。
MySQL 一看: “哦,你在赋值一个布尔表达式?没问题,合法!”
于是它把这条语句理解成了:
SET trigger_status =(-AND(job_group NOTIN(,)))所以整张表的 trigger_status 被批量改了 。
更惨的是,这条 SQL 没有 WHERE 子句。
也就是说,所有行都参与了更新,只是值被“布尔运算”洗了一遍。
AND 在 SET 里不是“条件”,而是“运算”— END —
如果你觉得这种“小坑”也值得警惕,欢迎点个「赞」和「在看」,转发给那个总是手写 SQL 的同事,帮他少踩一个坑。