如果在 Postgres db 中的多个列上发生冲突,则 Upsert

Ati*_*ska 5 postgresql insert upsert sql-update

我在 Postgres db 中有一个没有主键的表。如果两列的组合具有相同的值,我想更新。

...
ON CONFLICT (col1, col2)
DO UPDATE

ELSE 
INSERT
...
Run Code Online (Sandbox Code Playgroud)

没有主键我找不到任何东西。此外,col1 和 col2 的组合是唯一的。col1 可能有多行具有相同的值或 col2 但不能在一起。

所以我的表是这样的:

col1  col2
1     A    
1     B
2     A
2     B
Run Code Online (Sandbox Code Playgroud)

我不能对这些列中的任何一列设置唯一约束,但将索引组合在一起的工作方式如下:

CREATE TABLE example (
col1 integer,
col2 integer,
col3 integer,
UNIQUE (col1, col3));
Run Code Online (Sandbox Code Playgroud)

但是现在,如何处理插入物。应该是什么ON CONFLICT条件,因为我们不能在 2 列上有这样的条件,所以回到同样的问题。

Ati*_*ska 7

实际上,在这里找到它,但不是在标记为答案的帖子中,而是在评分最高的帖子中。在 ON CONFLICT 子句中使用多个冲突目标

所以我们的查询如下:

INSERT into table (col1, col2, col3)
VALUES ('1', 'A', 'colval1A')
ON CONFLICT (col1, col2) DO UPDATE 
SET col3 = 'good_value'
Run Code Online (Sandbox Code Playgroud)