MySQL UPDATE语句执行异常求助:误用AND替代WHERE后结果不符
为什么你的UPDATE语句没报错还把status设成了0?
嘿,这个问题其实挺典型的,很多人刚开始写SQL的时候都会踩这个语法坑。咱们一步步拆解来搞清楚原因:
1. MySQL是怎么解析你写错的语句的?
你写的语句是:
UPDATE TABLE SET status=1 AND finalStatus_id=1 AND id IN (1,3,4);
正常的UPDATE语法是UPDATE 表名 SET 列=值 WHERE 条件,但你误用AND替代了WHERE,导致MySQL把整个1 AND finalStatus_id=1 AND id IN (1,3,4)当成了给status赋值的表达式,而不是过滤行的条件。
2. 布尔表达式的求值规则
在MySQL里,布尔值是用整数表示的:1代表真,0代表假。那这个赋值表达式会被逐行计算:
- 对于每一行,MySQL会先计算
1 AND finalStatus_id=1:如果finalStatus_id不等于1,这个子表达式就是假(0);如果等于1,就是真(1)。 - 接着再和
id IN (1,3,4)做AND运算:如果id不在(1,3,4)里,不管前面的结果是什么,整个表达式都会变成假(0);如果id在这个列表里,就看前面的结果——要是finalStatus_id不是1,结果还是0。
所以最终,绝大多数行(甚至所有行)的status都会被赋值为0,只有当某行的finalStatus_id=1且id IN (1,3,4)时,status才会被设为1,但显然这和你原本的预期完全相反。
3. 为什么语句没报错?
因为这个语句在语法上是完全合法的!MySQL允许在SET子句中使用任意表达式来给列赋值,它不会检查你是不是“不小心把条件写到了赋值部分”——只会严格按照语法规则执行。所以服务器认为你就是想把这个布尔表达式的结果赋值给status,自然不会报错。
正确的写法应该是这样
如果你想给id IN (1,3,4)且finalStatus_id=1的行设置status=1,正确语句是:
UPDATE TABLE SET status=1 WHERE finalStatus_id=1 AND id IN (1,3,4);
如果你的初衷是把所有行的status都设为1,那更简单:
UPDATE TABLE SET status=1;
内容的提问来源于stack exchange,提问作者Akash Kumar
相关产品推荐
相关产品推荐

