PostgreSQL多值upserts

时间:2016-11-17 05:52:54

标签: node.js 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'), ('baz')

我用谷歌搜索了这个,并且找不到任何关于它的东西。

我有一个使用pg-promise的应用程序,我正在进行批处理。它可以工作,但它的速度非常慢(每5秒左右就会有50行......)。我想如果我可以取消批处理,而是正确构建这个多值upsert查询,它可以提高性能。

编辑: 嗯......我只是自己尝试过,不,它不起作用。除非我做错了。所以现在我想我的问题已经变成了,实现这样的事情的好方法是什么?

2 个答案:

答案 0 :(得分:6)

多值upsert绝对是可能的,并且实现了插入......对冲突的重要部分......

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-general邮件列表提交适当的反馈。或者甚至更好,为文档提出补丁。

答案 1 :(得分:0)

1.插入之前

enter image description here

2.Command

enter image description here

3.插入后

enter image description here