5

是否可以在 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 查询,它可以提高性能。

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

4

2 回答 2

11

多值 upsert 绝对是可能的,并且实现了为什么 insert ... on conflict ... 的重要部分。

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

于 2016-11-17T06:58:19.950 回答
1

1.插入前

在此处输入图像描述

2.命令

在此处输入图像描述

3.插入后

在此处输入图像描述

于 2017-09-15T07:20:14.630 回答