You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL 9.5:用staging表更新主表时重复更新行报错求助

解决PostgreSQL中UPDATE时"multiple updates to a row"的错误
  • 错误根源:你的staging表(stg)中存在同一个id对应多条记录的情况,原SQL里的distinct仅对val和updated去重,无法保证每个id只返回一行,导致更新主表(test)时同一行被多次匹配,触发PostgreSQL的多行更新限制。

  • 正确写法:
    以下几种写法都能确保每个主表行只被匹配一次,可根据业务场景选择:

    1. 当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;
    
    1. 当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;
    
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:07:36