sql >> データベース >  >> RDS >> PostgreSQL

postgresで外部キー違反をキャッチすることは可能ですか?

    一度に1行しか挿入しない場合は、セーブポイント 挿入前とロールバック 挿入が失敗した場合(または解放> 挿入が成功したとき)。

    Postgres 9.5以降では、 INSERT ... ON CONFLICT DO NOTHING それが言うことをします。 また ON CONFLICT DO UPDATE SET column = value...を書き込みます 、これにより、挿入が競合している行の更新に自動的に変換されます(この機能は「アップサート」と呼ばれることもあります)。

    OPが外部キーを処理しているため、これは機能しません。 一意ではなく制約 制約。その場合、前に説明したセーブポイント方式を最も簡単に使用できますが、複数の行の場合は面倒になる可能性があります。一度に複数の行を挿入する必要がある場合は、それらを複数の挿入ステートメントに分割することで十分なパフォーマンスが得られるはずです。提供 あなたは自動コミットモードで作業していません 、すべての挿入は1つのトランザクションで発生し、非常に多くの行を挿入することはありません。

    データベースと通信するためのラウンドトリップオーバーヘッドに加えて、すべての挿入にセーブポイントを設定するコストが単純に高すぎるため、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;
    



    1. SQLServerで日付を別のタイムゾーンに変換する

    2. サードパーティのOracle.NETプロバイダーの比較

    3. 右結合と左結合

    4. LAMPサイトの速度を最適化するためのベストプラクティスは?