在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>
範例:
建立一個具有唯一列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中文網其他相關文章!