将元素插入表格时,“列引用不明确”

ser*_*off 21 postgresql upsert coalesce

我使用 PostgreSQL 作为我的数据库。我需要在数据库中创建一个条目,如果它已经存在,只需更新其字段,但只有在未设置时才应更新其中一个字段。

我已经使用了这个问题的信息:https : //stackoverflow.com/questions/13305878/dont-update-column-if-update-value-is-null,它与我所拥有的非常相关。

我尝试使用此查询,但是当我运行它时,它会出错Column reference 'affiliate_code' is ambiguous

INSERT INTO accounts (id, token, affiliate_code)
VALUES (value1, value2, value3)
ON CONFLICT (id) DO
UPDATE SET token = value2,
  affiliate_code = COALESCE(affiliate_code, value3);
Run Code Online (Sandbox Code Playgroud)

(当然,实际值会被替换)。

如果我替换affiliate_code = COALESCE(affiliate_code, value3)affiliate_code = value3,一切正常,但不是我想要的方式。

我怎样才能使这项工作?

这是我的表的定义方式:

CREATE TABLE accounts (
  id VARCHAR NOT NULL UNIQUE,
  token VARCHAR NOT NULL,
  affiliate_code VARCHAR
);
Run Code Online (Sandbox Code Playgroud)

Eva*_*oll 22

从文档中,

conflict_action指定替代 ON CONFLICT 操作。它可以是 DO NOTHING 或 DO UPDATE 子句,指定在发生冲突时要执行的 UPDATE 操作的确切细节。ON CONFLICT DO UPDATE 中的 SET 和 WHERE 子句可以使用表名(或别名)访问现有行,并使用特殊排除表访问建议插入的行。目标表中读取相应排除列的任何列都需要 SELECT 权限。

所以相反,试试这个每个超立方体??

INSERT INTO accounts (id, token, affiliate_code)
VALUES (value1, value2, value3)
ON CONFLICT (id) DO
UPDATE SET token = value2,
  affiliate_code = COALESCE(accounts.affiliate_code, excluded.affiliate_code);
Run Code Online (Sandbox Code Playgroud)


小智 6

这个答案帮助我解决了一个稍微不同的模糊列问题。我有一张表,我们每天多次将每日汇总到同一张表中。我们需要每小时重新计算每日汇总,这意味着我们每天更新同一行 24 次。

转述上述内容:

INSERT INTO accounts as act 
    (affiliate_code, datum)
SELECT  affiliate_code, datum
FROM
    -- complex multi-table join with "datum" in more than one table.
ON CONFLICT (affiliate_code) DO
    UPDATE SET 
        -- Update knows "datum" is the target row
        datum = excluded.datum
    WHERE
        -- Here update needs to be told which of the multiple tables
        -- with datum to use. 
        act.datum != excluded.datum;
Run Code Online (Sandbox Code Playgroud)