首頁 >資料庫 >mysql教程 >如何處理 PostgreSQL 的 ON CONFLICT 子句中的多個衝突目標?

如何處理 PostgreSQL 的 ON CONFLICT 子句中的多個衝突目標?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-12 17:44:43507瀏覽

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子句可以指定兩列作為衝突目標,從而在衝突時實現所需的更新行為:

<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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn