PostgreSQL 使用UPSERT 資料不存在則插入,存在則更新
阿新 • • 發佈:2019-12-31
引言
該功能由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;
複製程式碼