是否可以在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行......)。我想,如果我能取消批处理,而是正确地构建这个多值的更新插入查询,它可以提高性能。
编辑:嗯...我自己刚刚试过,不,它不起作用。除非我做的不对。所以现在我想我的问题变成了,实现这种东西的好方法是什么?
多值升级绝对是可能的,并且实现了插入的重要部分…在冲突中…。
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.插入前
2.Command
3.插入后