PostgreSQL の ON CONFLICT: 複数の列にわたる競合の管理
PostgreSQL の ON CONFLICT
句は、INSERT
ステートメント中の競合解決を簡素化します。当初は単一列の制約用に設計されましたが、複数の列にわたる一意の制約を処理できるように容易に拡張できます。
重要なのは、関連するすべての列を含む一意のインデックスを作成することです。 これにより、ON CONFLICT
はこれらの複数列の組み合わせに基づいて競合を効果的に管理できるようになります。
たとえば、テーブルに列 col1
と col2
があり、それぞれ個別に一意であるが、組み合わせた一意性が必要な場合、単一列 ON CONFLICT
では不十分です。 解決策は?複数列の一意のインデックスを作成します:
<code class="language-sql">CREATE UNIQUE INDEX idx_table_col1_col2 ON table (col1, col2);</code>
これで、ON CONFLICT
句を変更できます。
<code class="language-sql">INSERT INTO table (col1, col2, col3) VALUES ('value1', 'value2', 'value3') ON CONFLICT (col1, col2) DO UPDATE SET col3 = EXCLUDED.col3;</code>
この改訂された INSERT
ステートメントは、複数列インデックスを利用します。 競合が発生した場合 (col1
と col2
の組み合わせが重複した場合)、DO UPDATE
セクションは col3
行の新しい値で EXCLUDED
のみを更新します。
このアプローチにより、特に複雑なデータセットや関係を扱う場合に、競合処理の柔軟性が向上し、データの整合性が強化されます。
以上がPostgreSQL の ON CONFLICT 句は複数の列にわたる競合をどのように処理できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。