该功能由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;
复制代码