SQL语句‘SET a=1 AND b=2’含义及错误UPDATE语句执行问题咨询
关于你提到的SQL语句疑问的解答
1. SET a=1 AND b=2 的含义
你大概率以为这条语句是同时把a设为1、b设为2,但实际上完全不是这么回事!这里的AND是逻辑运算符,SQL会把整个1 AND b=2当成一个布尔表达式来计算,然后把计算结果赋值给a。
举个实际场景的例子:如果当前b的值是2,那么1 AND b=2的结果是TRUE(在大多数数据库里会被转换成整数1),所以a会被设为1;如果b不等于2,这个表达式结果是FALSE(转换成整数0),a就会被设为0。要是你想同时给多个变量/列赋值,正确写法是用逗号分隔:SET a=1, b=2。
2. 错误的UPDATE table SET c1=1 AND c2=2 的执行逻辑与不报错原因
这条语句能正常执行不报错,核心原因是它在SQL语法上是合法的,只是完全偏离了你原本的意图。
SQL解析器会把这条语句解析成如下逻辑:
UPDATE table SET c1 = (1 AND (c2 = 2));
也就是说,它根本没有更新c2列,只是把c1列的值设置为逻辑表达式1 AND c2=2的计算结果:
- 如果某一行的
c2等于2,表达式结果为真,c1会被设为1(或数据库对应的布尔真值的数值/字符串表示) - 如果某一行的
c2不等于2,表达式结果为假,c1会被设为0(或对应的假值表示)
之所以不报错,是因为SQL允许在SET子句的赋值右侧使用任何合法的表达式——逻辑表达式的结果可以被隐式转换为c1列的数据类型(只要类型兼容,比如整数列接收布尔转换的数值,就不会有问题)。而你原本想要的批量更新多个列的写法,应该是用逗号分隔每个列的赋值:
UPDATE table SET c1=1, c2=2;
内容的提问来源于stack exchange,提问作者user2286243
相关产品推荐
相关产品推荐

