首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >一条 SQL 把整表数据改崩,MySQL 还没报错?我懵了!

一条 SQL 把整表数据改崩,MySQL 还没报错?我懵了!

作者头像
小博测试成长之路
发布2025-11-12 20:23:52
发布2025-11-12 20:23:52
810
举报
文章被收录于专栏:软件测试学习软件测试学习

“我明明写了条件,怎么全表都被更新了?!” “更离谱的是,MySQL 还没报错,执行成功了!”

这不是段子,这是今天真实发生在我身上的故事。

01 一条“看似正常”的 SQL

事情是这样的:

一位开发小哥想更新一张任务调度表,将某些的任务状态改成 -2,于是他写了这么一条 SQL:

代码语言:javascript
复制
UPDATE wl_quotes_scheduler.xxl_job_info
SET trigger_status =-2 AND job_group NOTIN(61,58);

执行完一看,执行成功:


02 为什么没报错?MySQL:语法没错,是你用错了

我们来把这条 SQL 拆开看:

代码语言:javascript
复制
SET trigger_status =-AND job_group NOTIN(,)

注意,这里用了一个 AND,但它不是在 WHERE 子句里,而是在 SET 子句里

MySQL 一看: “哦,你在赋值一个布尔表达式?没问题,合法!”

于是它把这条语句理解成了:

代码语言:javascript
复制
SET trigger_status =(-AND(job_group NOTIN(,)))

所以整张表的 trigger_status 被批量改了 。


03 没写 WHERE,全表都更新!

更惨的是,这条 SQL 没有 WHERE 子句

也就是说,所有行都参与了更新,只是值被“布尔运算”洗了一遍。


04 小结:SQL 不报错,不代表没坑

  • MySQL 允许在 SET 子句里写表达式,包括布尔表达式
  • AND 在 SET 里不是“条件”,而是“运算”
  • 没有 WHERE 子句,就是全表更新
  • 布尔值 TRUE/FALSE 在数值上下文里是 1/0

一开始我也纳闷这个用法到底有没有问题,有没有语法错误,截图发到微信群里问其他小伙伴,发现也有一些小伙伴说会报错啥的,大家有疑问的话大家也可以自己找个数据库执行类似的脚本试试。

— END —

如果你觉得这种“小坑”也值得警惕,欢迎点个「赞」和「在看」,转发给那个总是手写 SQL 的同事,帮他少踩一个坑。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小博测试成长之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01 一条“看似正常”的 SQL
  • 02 为什么没报错?MySQL:语法没错,是你用错了
  • 03 没写 WHERE,全表都更新!
  • 04 小结:SQL 不报错,不代表没坑
  • 一开始我也纳闷这个用法到底有没有问题,有没有语法错误,截图发到微信群里问其他小伙伴,发现也有一些小伙伴说会报错啥的,大家有疑问的话大家也可以自己找个数据库执行类似的脚本试试。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档