一度に1行しか挿入しない場合は、セーブポイント
挿入前と
Postgres 9.5以降では、 INSERT ... ON CONFLICT DO NOTHING
それが言うことをします。 また ON CONFLICT DO UPDATE SET column = value...
を書き込みます 、これにより、挿入が競合している行の更新に自動的に変換されます(この機能は「アップサート」と呼ばれることもあります)。
OPが外部キーを処理しているため、これは機能しません。 一意ではなく制約 制約。その場合、前に説明したセーブポイント方式を最も簡単に使用できますが、複数の行の場合は面倒になる可能性があります。一度に複数の行を挿入する必要がある場合は、それらを複数の挿入ステートメントに分割することで十分なパフォーマンスが得られるはずです。提供 あなたは
データベースと通信するためのラウンドトリップオーバーヘッドに加えて、すべての挿入にセーブポイントを設定するコストが単純に高すぎるため、1つのステートメントに複数の挿入が実際に必要になる場合があります。この場合、いくつかの不完全なアプローチがあります。おそらく最も悪い データを選択して他のテーブルと結合するネストされたクエリを作成することです。次のようになります。
INSERT INTO table_A (column_A, column_B, column_C)
SELECT A_rows.*
FROM VALUES (...) AS A_rows(column_A, column_B, column_C)
JOIN table_B ON A_rows.column_B = table_B.column_B;