我最近在 Postgres 中遇到了这种奇怪的行为。我有一张如下表:
sasdb=# \d emp_manager_rel 表“db3004db.emp_manager_rel” 专栏 | 类型 | 整理 | 可空 | 默认 ------------+--------+------------+----------+----- ---- emp_id | 大整数 | | | manager_id | 大整数 | | | 从 emp_manager_rel 中选择 * ; emp_id | manager_id --------+------------ 1 | 123
我执行了以下更新语句:
更新 1:
更新 emp_manager_rel 设置 manager_id = manager_id+emp_id , emp_id=emp_id*4;
更新表格如下:
emp_id | manager_id --------+------------ 4 | 124
更新 2:我执行了以下查询(在原始表上,而不是在更新后)
更新 emp_manager_rel 设置 emp_id=emp_id*4 , manager_id = manager_id+emp_id ;
它更新表格如下:
emp_id | manager_id --------+------------ 4 | 124
我预计 UPDATE 2 上 manager_id 的值为 127(因为 emp_id 已被 empid * 4 更改为 4)。但是,两个 UPDATES 产生相同的结果。我想知道 ANSI 标准中 set 子句的执行顺序是什么。
这种行为没有什么“奇怪”的——这是处理此类更新的唯一明智的方法。
没有“更新顺序”之类的东西——所有 SET 子句都应该被假定为并行发生。
SQL 标准要求赋值的右侧是UPDATE 语句开始之前的列值。UPDATE 语句中列分配的顺序与 UPDATE 语句的结果无关。
UPDATE 语句的任何其他行为都是错误并且违反了 SQL 标准。
出于同样的原因,以下语句将交换两个列值:
或者