PostgreSQL 使用UPSERT 數據不存在則插入,存在則更新

引言

該功能由PostgreSQL9.5 開始支持。在此以前若是想插入一條數據,該數據的主鍵已經存在,則沒法插入。使用upset句,能夠無則插入,有則更新。bash

語法

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

1. 嘗試Upset

首先,建立一個表,並插入一條數據。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 行)
複製代碼

2. 嘗試使用 DO NOTHING

繼續對剛纔的表進行操做,會發現執行結果沒有更新任何數據,可是避免了主鍵重複錯誤。若是在開發中有這種場景又不想出錯的話能夠使用do nothing。blog

執行語句

insert into m_user values('0001','0002','admin')
on conflict on constraint m_user_pkey
do nothing;
複製代碼
相關文章
相關標籤/搜索