web-dev-qa-db-ja.com

競合ターゲットに複数

abに2つの一意のインデックスがあります。私はこのようなものが必要です:

insert into my_table (a, b) values (1, 2), (1, 2)
on conflict (a) do update set c = 'a_violation'
on conflict (b) do update set c = 'b_violation'

だから一般的に私は競合ターゲットに基づいて異なる更新を行いたい-上記の構文はサポートされていません(1つだけon conflictステートメントがサポートされています)。これを行う他の方法はありますか?

9
user606521

あなたの例はVALUES句自体に重複する行を提案しています-これは次の結果になります:

エラー:ON CONFLICT DO UPDATEコマンドは行に2回影響を与えることはできません

入力で重複を折りたたむことで解決できます。見る:

ただし、関連する問題がアウトラインクエリ全体に影響を与えるため、簡単に克服することはできません。

同じ入力行が複数の一意の違反をトリガーする場合はどうしますか?
複数の入力行が同じ一意の違反をトリガーした場合はどうしますか?
複数の入力行が同じターゲット行の異なる一意の違反をトリガーする場合はどうしますか?
そしてそれらの組み合わせ。

Postgres開発者はおそらくこのワームの缶を開けたくなく、UPSERT機能をsingle制約に制限しました。

ON CONFLICT DO NOTHING -競合ターゲットなし-any該当する違反に対して機能します。 thisバリアント(「何もしない」)の代替アクションは明確です。

より具体的な答えを得るには、もっと具体的である必要があります(同時実行性と可能な書き込み負荷についても)。

7