ホームページ > データベース > mysql チュートリアル > PostgreSQL の ON CONFLICT 句で複数の競合ターゲットを処理する方法は?

PostgreSQL の ON CONFLICT 句で複数の競合ターゲットを処理する方法は?

Mary-Kate Olsen
リリース: 2025-01-12 17:44:43
オリジナル
450 人が閲覧しました

How to Handle Multiple Conflict Targets in PostgreSQL's ON CONFLICT Clause?

ON CONFLICT 句での複数の競合ターゲットの使用

テーブルに複数の一意の列が含まれており、競合が発生した場合に他の列を更新するために INSERT ... ON CONFLICT ... DO UPDATE 構文が必要な場合は、すべての競合ターゲット列を含む一意のインデックスを作成する必要があります。

質問:

ON CONFLICT 句で複数の列を競合ターゲットとして使用しようとすると、競合検出を実行するには一意のインデックスが必要であるため、エラーが発生します。次の例を考えてみましょう:

<code class="language-sql">INSERT INTO table
...
ON CONFLICT (col1, col2)
DO UPDATE
SET
....</code>
ログイン後にコピー
ログイン後にコピー

解決策:

この問題を解決するには、両方の列に一意のインデックスを作成します:

<code class="language-sql">CREATE UNIQUE INDEX idx_t_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>
ログイン後にコピー
ログイン後にコピー

例:

一意の列 ida を持つテーブルを作成し、競合を処理しながらデータを挿入します:

<code class="language-sql">CREATE TABLE t (id integer, a text, b text);
CREATE UNIQUE INDEX idx_t_id_a ON t (id, a);
INSERT INTO t VALUES (1, 'a', 'foo');
INSERT INTO t VALUES (1, 'a', 'bar') ON CONFLICT (id, a) DO UPDATE SET b = 'bar';</code>
ログイン後にコピー

クエリを実行して更新されたデータを確認します:

<code class="language-sql">SELECT * FROM t;</code>
ログイン後にコピー

出力:

<code> id | a |  b  
----+---+-----
  1 | a | bar</code>
ログイン後にコピー

以上がPostgreSQL の ON CONFLICT 句で複数の競合ターゲットを処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート