PostgreSQL の ON CONFLICT 句での複数の競合ターゲットの指定
PostgreSQL テーブルには、一意として指定された複数の列が含まれることがよくあります。 ON CONFLICT 句を使用すると、単一の競合ターゲットに基づいて競合を検出できますが、複数の一意の列を持つテーブルを管理する場合は制限される可能性があります。
この制限を克服するために、PostgreSQL は複数の列にまたがる一意のインデックスを作成するという簡単な解決策を提供します。これを行うと、ON CONFLICT 句で複数の競合ターゲットを効果的に指定できます。
例:
2 つの一意の列col1 とcol2 を持つテーブルを考えてみましょう。次のコマンドを使用して、これら 2 つの列に一意のインデックスを作成できます:
<code class="language-sql">CREATE UNIQUE INDEX idx_table_col1_col2 ON table(col1, col2);</code>
このインデックスを利用して、ON CONFLICT 句の次の 2 つの列に関係する競合を処理できるようになりました。
<code class="language-sql">INSERT INTO table ... ON CONFLICT (col1, col2) DO UPDATE SET ...</code>
競合が発生すると、PostgreSQL は新しい行のcol1 とcol2 の値を既存の行と比較して一意性を確認します。競合が検出された場合は、DO UPDATE 句が起動され、必要に応じて他の列を更新できるようになります。
注: 一意のインデックスに加えて、PostgreSQL は除外制約もサポートします。一意制約は、特定の列または列セットの重複値を防ぎますが、除外制約はさらに一歩進んで、特定の条件を満たす行を除外します。これは、より複雑なデータ整合性ルールを適用したい場合に役立ちます。
以上がPostgreSQL の ON CONFLICT 句で複数の一意の列との競合を処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。