UPSERT - INSERT ...在衝突中更新......

版本 9.5 postgres 提供 UPSERT 功能與 INSERT 語句。

假設你有一個名為 my_table 的表,在之前的幾個示例中建立。我們插入一行,返回插入行的 PK 值:

b=# INSERT INTO my_table (name,contact_number) values ('one',333) RETURNING id;
 id  2
(1 row)

INSERT 0 1

現在,如果我們嘗試使用現有唯一鍵插入行,則會引發異常:

b=# INSERT INTO my_table values (2,'one',333);
ERROR:  duplicate key value violates unique constraint "my_table_pkey"
DETAIL:  Key (id)=(2) already exists.

Upsert 功能提供了插入它的能力,解決衝突:

b=# INSERT INTO my_table values (2,'one',333) ON CONFLICT (id) DO UPDATE SET name = my_table.name||' changed to: "two" at '||now() returning *;
 id |                       name                             | contact_number
----+-----------------------------------------------------------------------------------------------------------+----------------
  2 | one changed to: "two" at 2016-11-23 08:32:17.105179+00 |            333
(1 row)

INSERT 0 1