【问题标题】:Postgres Upsert Cardinality ViolationPostgres Upsert 基数违规
【发布时间】:2023-01-30 23:29:19
【问题描述】:

我正在尝试将从 sql 表中提取的数据插入到 postgres 表中,其中行可能存在也可能不存在。如果它们确实存在,我想将特定列设置为其默认值 (0)

该表是

site_notes (
job_id text primary key,
attachment_id text,
complete int default 0);

我的查询是

INSERT INTO site_notes (
                job_id,
                attachment_id
            )
            VALUES 
                {jobs_sql}
            ON CONFLICT (job_id) DO UPDATE
            SET complete = DEFAULT;

但是我收到一个错误:psycopg2.errors.CardinalityViolation:ON CONFLICT DO UPDATE 命令不能第二次影响行 提示:确保在同一命令中建议插入的行没有重复的约束值。

任何人都可以建议如何设置完全的冲突事件时的默认列?

非常感谢

【问题讨论】:

    标签: postgresql upsert


    【解决方案1】:

    INSERT ... ON CONFLICT DO UPDATE 语句(实际上也是 UPDATE 语句)不允许多次修改同一行。目前尚不清楚您问题中的 {jobs_sql} 是什么,但它必须包含多行,并且其中至少有两行具有相同的 job_id

    确保相同的 job_id 在您想要 INSERT 的行中不会多次出现。

    【讨论】:

      猜你喜欢
      • 2016-10-13
      • 1970-01-01
      • 2013-03-23
      • 2016-10-01
      • 2021-12-14
      • 2019-11-12
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多