PostgreSQL多值upserts

PostgreSQL多值upserts,postgresql,pg-promise,Postgresql,Pg Promise,是否可以在PostgreSQL中执行多值upsert?我知道存在多值插入,正如“ON CONFLICT”关键字一样,如果违反了该关键字,将执行更新。。。但是有可能把这两者结合起来吗?大概是这样的 INSERT INTO table1(col1, col2) VALUES (1, 'foo'), (2,'bar'), (3,'baz') ON CONFLICT ON CONSTRAINT theConstraint DO UPDATE SET (col2) = ('foo'), ('bar'),

是否可以在PostgreSQL中执行多值upsert?我知道存在多值插入,正如“ON CONFLICT”关键字一样,如果违反了该关键字,将执行更新。。。但是有可能把这两者结合起来吗?大概是这样的

INSERT INTO table1(col1, col2) VALUES (1, 'foo'), (2,'bar'), (3,'baz')
ON CONFLICT ON CONSTRAINT theConstraint DO
UPDATE SET (col2) = ('foo'), ('bar'), ('baz')
我用谷歌搜索出了这里面的积垢,但找不到任何关于它的信息

我有一个应用程序,是利用pg承诺,我正在做批处理。它可以工作,但速度非常慢(大约每5秒50行左右…)。我想,如果我可以取消批处理,而是正确地构建这个多值upsert查询,它可以提高性能

编辑:
好。。。我自己就试过了,不,不行。除非我做得不对。所以现在我想我的问题变成了,什么是实现这样的东西的好方法?

多值upsert肯定是可能的,这也是为什么insert。。。关于冲突。。。已实施

CREATE TABLE table1(col1 int, col2 text, constraint theconstraint unique(col1));

INSERT INTO table1 VALUES (1, 'parrot'), (4, 'turkey');

INSERT INTO table1 VALUES (1, 'foo'), (2,'bar'), (3,'baz')
ON CONFLICT ON CONSTRAINT theconstraint
DO UPDATE SET col2 = EXCLUDED.col2;
导致

regress=> SELECT * FROM table1 ORDER BY col1;
 col1 | col2 
------+------
    1 | foo
    2 | bar
    3 | baz
    4 | turkey
(4 rows)
如果文件不清楚,请向pgsql通用邮件列表提交适当的反馈。或者更好的做法是,在插入之前为文档提出一个补丁。

1

2.指挥部

3.插入后


可能重复感谢@vitaly-t。我将使用其中一些模板,并在下面的答案中构建查询。我错过了upsert中重要的“排除”部分。感谢那个pg承诺图书馆的人。。。一直在广泛使用它,它绝对是美妙的!!!这一个可能更接近你的问题:。太棒了,非常感谢!!在我的愚蠢中,我没有检查特殊的“排除”表达式。在postgres wiki中找到此。。。尽管冲突文档中隐藏了一点:--多行插入或更新,使用特殊的EXCLUDED.*表达式引用被拒绝的元组: