1. 程式人生 > 程式設計 >PostgreSQL 使用UPSERT 資料不存在則插入,存在則更新

PostgreSQL 使用UPSERT 資料不存在則插入,存在則更新

引言

該功能由PostgreSQL9.5 開始支援。在此之前如果想插入一條資料,該資料的主鍵已經存在,則無法插入。使用upset句,可以無則插入,有則更新。

語法

INSERT INTO 表名 VALUES ('値1','値2',...)
ON CONFLICT ON CONSTRAINT 制約名
DO UPDATE SET 列1='値',列2='値',...;
複製程式碼

1. 嘗試Upset

首先,建立一個表,並插入一條資料。

create table m_user (
  username character varying(8) not null,password character varying(16),auth character varying(16),primary key (username)
);
複製程式碼
insert into m_user values('0001','0001','admin');
複製程式碼

然後調查該表的制約名。

select table_name,constraint_name,constraint_type
from   information_schema.table_constraints
where  table_name='m_user';
複製程式碼

可以發現該制約名為m_user_pkey。

當然,也可以在建立表時,就自定義制約名。

create table m_user (
  username character varying(8) not null,constraint m_user_pkey primary key (username)
);
複製程式碼

嘗試執行以下語句,制約名指定m_user_pkey。會發現即使主鍵0001的username已經存在,則把他的password改為了0002。

執行語句

insert into m_user values('0001','0002','admin')
on conflict on constraint m_user_pkey
do update set password='0002';
複製程式碼

執行結果

 username | password | auth
----------+----------+-------
 0001     | 0002     | admin
(1 行)
複製程式碼

2. 嘗試使用 DO NOTHING

繼續對剛才的表進行操作,會發現執行結果沒有更新任何資料,但是避免了主鍵重複錯誤。如果在開發中有這種場景又不想出錯的話可以使用do nothing。

執行語句

insert into m_user values('0001','admin')
on conflict on constraint m_user_pkey
do nothing;
複製程式碼