PostgreSQL两条UPDATE语句执行结果不同的两列整数表示例查询
结论
存在,当表中包含x或y为NULL的记录时,两条UPDATE语句的执行结果存在明显差异。
原因分析
- 第一条UPDATE语句的WHERE条件为
x != y:在PostgreSQL的三值逻辑规则下,只要参与比较的任意一个值为NULL,比较运算的返回结果就是NULL,而WHERE条件仅会命中返回值为TRUE的行,NULL会被视为不满足条件。也就是说只要x为NULL、或y为NULL、或两者均为NULL的行,都不会被第一条语句匹配到。 - 第二条UPDATE语句的WHERE条件为
1 = 1 OR (NULL IS NOT NULL):逻辑OR运算只要存在一个为TRUE的子条件,整体条件就为TRUE。此处1=1恒为真,因此整个WHERE条件恒成立,会匹配表中所有的行。
验证示例
我们可以通过以下测试代码验证差异:
-- 创建测试表 CREATE TABLE tab (x INTEGER, y INTEGER); -- 插入包含NULL的测试数据 INSERT INTO tab VALUES (1, 2), (NULL, 3), (4, NULL), (NULL, NULL), (5,5);
第一条语句执行后结果
仅(1,2)满足x != y被更新为(2,2),其余行无变化,最终数据:
(2,2), (NULL,3), (4,NULL), (NULL,NULL), (5,5)
第二条语句执行后结果
所有行都被匹配执行赋值,最终数据:
(2,2), (3,3), (NULL,NULL), (NULL,NULL), (5,5)
二者结果显然不同。
内容的提问来源于stack exchange,提问作者user17253648
相关产品推荐
相关产品推荐

