PostgreSQL 13中同一UPDATE语句内字段计算结果是否可复用?
PostgreSQL 13 UPDATE语句中字段计算结果复用问题
在PostgreSQL 13的同一条UPDATE语句里,无法复用SET子句中刚更新的字段计算结果。所有SET子句里的字段计算,都是基于该行更新前的原始数据,而非刚设置的新值。比如你给出的示例代码:
UPDATE table SET sum_col = col_1 + col_2, another_sum_col = sum_col + col_3;
这里another_sum_col用到的sum_col是更新前的旧值,不是刚计算出来的col_1+col_2,这就是你遇到数据差异的核心原因。
不需要执行第二次UPDATE,有两种更高效的解决方式:
- 重复计算逻辑:把
sum_col的计算式直接代入another_sum_col的计算中,适合逻辑简单的场景:
UPDATE table SET sum_col = col_1 + col_2, another_sum_col = (col_1 + col_2) + col_3;
- 用CTE预计算值:如果业务逻辑复杂,为避免重复写计算式,可以先用CTE算出所有需要的新值,再一次性更新,结果更准确也更清晰:
WITH updated_vals AS ( SELECT id, -- 假设表有主键id用于关联 col_1 + col_2 AS new_sum_col, (col_1 + col_2) + col_3 AS new_another_sum_col FROM table -- 可添加WHERE条件过滤需要更新的行 ) UPDATE table t SET sum_col = uv.new_sum_col, another_sum_col = uv.new_another_sum_col FROM updated_vals uv WHERE t.id = uv.id;
内容的提问来源于stack exchange,提问作者strumpy_strudel
相关产品推荐
相关产品推荐

