該功能由PostgreSQL9.5 開始支持。在此以前若是想插入一條數據,該數據的主鍵已經存在,則沒法插入。使用upset句,能夠無則插入,有則更新。bash
INSERT INTO 表名 VALUES ('値1', '値2', ...)
ON CONFLICT ON CONSTRAINT 制約名
DO UPDATE SET 列1='値', 列2='値', ...;
複製代碼
首先,建立一個表,並插入一條數據。ui
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');
複製代碼
而後調查該表的制約名。spa
select table_name, constraint_name, constraint_type
from information_schema.table_constraints
where table_name='m_user';
複製代碼
能夠發現該制約名爲m_user_pkey。code
固然,也能夠在建立表時,就自定義制約名。orm
create table m_user (
username character varying(8) not null
, password character varying(16)
, auth character varying(16)
, constraint m_user_pkey primary key (username)
);
複製代碼
嘗試執行如下語句,制約名指定m_user_pkey。會發現即便主鍵0001的username已經存在,則把他的password改成了0002。cdn
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 行)
複製代碼
繼續對剛纔的表進行操做,會發現執行結果沒有更新任何數據,可是避免了主鍵重複錯誤。若是在開發中有這種場景又不想出錯的話能夠使用do nothing。blog
insert into m_user values('0001','0002','admin')
on conflict on constraint m_user_pkey
do nothing;
複製代碼