PostgreSQL の ON CONFLICT
句: 複数の一意の列にわたる競合の管理
PostgreSQL の強力な ON CONFLICT
句により、重複行の挿入の処理が簡素化され、エラーの代わりに更新が可能になります。 重要な疑問が生じます: この句は、一意にインデックス付けされた複数の列に関係する競合を効果的に管理できますか?
複数の一意の列間で競合が発生した場合、追加の列を更新する必要があるため、単一列の競合ターゲットを超えた解決策が必要になります。 解決策は、関連する列にわたる複合一意インデックスを定義することです。
その仕組みは次のとおりです。id
と name
の両方に一意の制約があるテーブルがあるとします。
<code class="language-sql">CREATE TABLE test (id INT, name TEXT, UNIQUE (id), UNIQUE (name));</code>
id
と name
に個別の一意のインデックスを作成することは、単一の一意の制約 UNIQUE (id, name)
を作成することと機能的に同等であることに注意してください。 id
または name
(または両方) に基づいて競合を処理するには、ON CONFLICT
句で複合インデックスを使用します。
<code class="language-sql">INSERT INTO test (id, name) ON CONFLICT (id, name) DO UPDATE SET ...;</code>
このアプローチにより、データベースは id
と name
の組み合わせ値に基づいて競合を効率的に特定し、必要に応じて DO UPDATE
アクションをトリガーできます。
重要なのは、ON CONFLICT
句は、指定されたすべての競合ターゲット列をカバーする一意制約 (またはインデックス) の存在に依存しています。 このような制約なしで ON CONFLICT
を使用しようとすると、データベース エラーが発生します。
以上がPostgreSQL の ON CONFLICT 句は、複数の一意のインデックスを持つ列を競合ターゲットとして処理できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。