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)
| 归档时间: |
|
| 查看次数: |
22843 次 |
| 最近记录: |