2016-11-17 1 views
3

PostgreSQLでマルチバリューアップを行うことは可能ですか?私は多値の挿入物が存在することを知っています、もしキーが侵害された場合に更新を実行するために "ON CONFLICT"キーワードがあります...しかし、それを一緒にすることは可能ですか?何かがそうであるように...PostgreSQLのマルチバリューアップサイズ

INSERT INTO table1(col1, col2) VALUES (1, 'foo'), (2,'bar'), (3,'baz') 
ON CONFLICT ON CONSTRAINT theConstraint DO 
UPDATE SET (col2) = ('foo'), ('bar'), ('baz') 

私はこれの無駄をgoogled、それに関して何かを見つけることができませんでした。

私はpg-promiseを利用しているアプリがあり、バッチ処理を行っています。それは動作しますが、恐ろしく遅いです(5秒ごとに50行目など)。バッチ処理をやめて、この複数値upsertクエリを正しく構築すると、パフォーマンスが向上する可能性があると私は思いました。

編集: まあ...私はそれを自分で試しただけで、うまくいきません。私がそれを間違ってやっていない限り。だから私の質問が変わったと思いますが、このようなものを実装する良い方法は何ですか?

+0

可能重複ro w Update in Node.js](http://stackoverflow.com/questions/39119922/postgresql-multi-row-updates-in-node-js) –

+0

ありがとう、@ vitaly-t。私はこれらのテンプレートのいくつかを、以下の答えでクエリを構築するのと組み合わせて使用​​します。私はupsertの重要な "除外された"部分を見逃していました。そのpg-promiseライブラリの人に感謝します...それを広範に使用しており、それは絶対に素晴らしいです! – dvsoukup

+0

これは多分あなたの質問に近いでしょう:[多列挿入pg-promise](http://stackoverflow.com/questions/37300997/multi-row-insert-with-pg-promise)。 –

答えて

4

間違いなく、挿入...競合が発生した理由の重要な部分が実装されました。ドキュメントが不明瞭だったら

regress=> SELECT * FROM table1 ORDER BY col1; 
col1 | col2 
------+------ 
    1 | foo 
    2 | bar 
    3 | baz 
    4 | turkey 
(4 rows) 

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; 

結果は、pgsqlの-一般的なメーリングリストに適切なフィードバックを提出してください。あるいは、ドキュメントにパッチを付けることをお勧めします。

+0

素晴らしいです、ありがとうございます!私の愚か者では私は特別な「除外された」表現を調べなかった。これはpostgres wikiで見つかりました... ON CONFLICTのドキュメントに少し埋め込まれていますが、 - 特別なEXCLUDED。*式を使用して拒否されたタプルを参照して、複数行の挿入または更新を行いました。 – dvsoukup

0

1.Before [PostgreSQLのマルチの挿入

enter image description here

2.Command

enter image description here

インサート3.After

enter image description here