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

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

Mary-Kate Olsen
發布: 2025-01-12 17:44:43
原創
497 人瀏覽過

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板