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>
例:
一意の列 id
と a
を持つテーブルを作成し、競合を処理しながらデータを挿入します:
<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 サイトの他の関連記事を参照してください。