PostgreSQL 16 中 UPDATE FROM 如何正确关联
时间:2026-08-22 | 作者:星河游者 | 阅读:0在PostgreSQL 16中,使用UPDATE FROM时需注意,目标表只能在UPDATE后声明,不能出现在FROM中。并且,必须包含类似t.id = src.id这样的显式关联条件,否则会触发笛卡尔积,进而导致误更新。另外,FROM后面可以接子查询,但子查询必须带有别名。在此推荐,先用等价的SELECT语句来验证匹配行数与唯一性。
PostgreSQL 16 的 UPDATE FROM 不支持目标表出现在 FROM 中
你写的 UPDATE a FROM a JOIN b 会悄无声息地失效,并非语法报错,而是 JOIN 部分被完全无视了。这是因为目标表 a 在 UPDATE 后已经声明过,又在 FROM 中再次出现,从而引发了自引用歧义。PostgreSQL 16 延续了旧规则:目标表只能在 UPDATE 关键字后出现一次,FROM 子句里必须是“其他表”或者封装好的子查询。
必须显式写出关联条件,否则极易全表误更新
漏掉 WHERE t.id = src.t_id 这类显式等值连接,会导致 FROM 子句产生笛卡尔积,UPDATE 就会匹配到所有组合行,最终把目标表每一行都更新成源数据的某一行(通常是第一行或最后一行,取决于执行计划),且返回“UPDATE 1000”这种看似成功实则错误的结果。
- 永远不要只靠
src.status = 'active'这类过滤条件,它不建立表间关系 - WHERE 中至少要有一个
t.xxx = src.yyy形式的等值关联 - 多对一场景(如一个用户多条订单)下,建议加
DISTINCT ON (t.id)或聚合,避免重复匹配
FROM 后只能跟一个“源结构”,但可以是嵌套 JOIN
FROM 后不能平铺写 b, c 或 b JOIN c JOIN d,但可以把它包进一层子查询或带别名的 JOIN 表达式里:
UPDATE users u SET email = src.email, updated_at = NOW() FROM ( SELECT user_id, email FROM new_contacts WHERE is_valid ) AS src WHERE u.id = src.user_id;
- 子查询必须有别名(如
AS src),否则报错missing FROM-clause entry - 子查询里字段名若与目标表冲突(比如都有
id),必须用别名限定,否则解析失败 - 嵌套太深会影响可读性,建议复杂逻辑先用
WITH提前定义,再在FROM中引用
验证更新范围最可靠的方法:把 FROM + WHERE 拆出来跑 SELECT
写完 UPDATE ... FROM ... WHERE ... 后,把 FROM 和 WHERE 部分单独拿出来,拼成等价 SELECT:
SELECT u.id, src.email FROM users u JOIN new_contacts src ON u.id = src.user_id WHERE src.is_valid;
- 这个
SELECT返回的行数,就是你即将更新的行数 - 检查结果里是否有重复
u.id—— 如果有,说明存在一对多匹配,更新结果不可控 - 如果
SELECT返回 0 行,但你预期有数据,问题一定出在关联条件或数据本身(比如 NULL 值导致等值不成立)
真正容易被忽略的是:PostgreSQL 16 对 JSONB 字段、分区表和 GENERATED 列的更新行为没有变化,但如果你在 FROM 子查询里用了这些特性,执行计划可能意外走 Seq Scan,务必用 EXPLAIN 看实际路径。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 迅捷路由器怎么调信号最强,设置时要注意什么?
- 时间:2026-08-27
-
- vivo浏览器怎么卸不掉?原因和解决方法在这里
- 时间:2026-08-27
-
- OPPO R11s黑屏了,怎么强制恢复出厂设置?
- 时间:2026-08-27
-
- 飞利浦显示器包装盒有生产日期和保修期吗?怎么看?
- 时间:2026-08-27
-
- 联想新平板开机必须联网吗?怎么做?
- 时间:2026-08-27
-
- 平板横竖屏切换设置与问题解决
- 时间:2026-08-27
-
- 移动电源容量怎么测?要准备哪些工具?
- 时间:2026-08-27
-
- 荣耀90 Pro防水吗?防水级别多少?怎么用才安全
- 时间:2026-08-27
精选合集
更多大家都在玩
大家都在看
更多-
- 糖尿病完全不能吃糖吗
- 时间:2026-09-15
-
- 蚂蚁庄园小课堂2026年9月16日最新题目答案
- 时间:2026-09-15
-
- 小鸡答题今天的答案是什么2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园每日答题答案2026年9月16日
- 时间:2026-09-15
-
- 以下哪种粮食是酿造绍兴黄酒的主要原料 蚂蚁庄园今日答案9月16日
- 时间:2026-09-15
-
- 劝学名句“及时当勉励,岁月不待人”出自哪位诗人 蚂蚁庄园今日答案9.16
- 时间:2026-09-15
-
- 蚂蚁庄园今天答题答案2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园答题今日答案2026年9月16日
- 时间:2026-09-15
