PostgreSQL 9.5:用staging表更新主表时重复更新行报错求助
解决PostgreSQL中UPDATE时"multiple updates to a row"的错误
错误根源:你的staging表(stg)中存在同一个
id对应多条记录的情况,原SQL里的distinct仅对val和updated去重,无法保证每个id只返回一行,导致更新主表(test)时同一行被多次匹配,触发PostgreSQL的多行更新限制。正确写法:
以下几种写法都能确保每个主表行只被匹配一次,可根据业务场景选择:- 当stg表中同一id的记录值完全重复时,按id分组去重:
UPDATE test t SET val = s.val, updated = s.updated FROM ( SELECT id, val, updated FROM stg GROUP BY id, val, updated ) s WHERE t.id = s.id;- 当stg表中同一id有不同记录,需取最新更新的记录:
UPDATE test t SET val = s.val, updated = s.updated FROM ( SELECT id, val, updated, ROW_NUMBER() OVER (PARTITION BY id ORDER BY updated DESC) AS rn FROM stg -- 若有其他优先级字段,可调整ORDER BY的内容 ) s WHERE t.id = s.id AND s.rn = 1;- 使用PostgreSQL特有的
DISTINCT ON语法,简洁实现按id取唯一记录:
UPDATE test t SET val = s.val, updated = s.updated FROM ( SELECT DISTINCT ON (id) id, val, updated FROM stg ORDER BY id, updated DESC -- 按更新时间倒序,取最新一条 ) s WHERE t.id = s.id;补充:原SQL存在语法笔误(
WHERE t1.id=s1.id a)s中的多余a),即使修正后仍无法解决多行匹配问题,上述写法从根源上确保了关联数据源的唯一性。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

