您好,登錄后才能下訂單哦!
新遇到一個業務需求,往postgresql中插入數據的時候需滿足:如果數據庫存在這條記錄,則進行修改;不存在則進行插入。
Oracle中可以用merge來解決。Pg中之前沒做過類似操作,百度查了一下,PostgreSQL 9.5 版本帶來了一個新特性:UPSERT。UPSERT是INSERT, ON CONFLICT UPDATE的簡寫,簡而言之就是:插入數據,正常時寫入,主鍵沖突時更新。
示例來看一下:
一張測試表,結構如下:
yqm=# \d student;
Table "public.student"
Column | Type | Modifiers
--------+-----------------------+-----------
id | integer |
name | character varying(20) |
Indexes:
"id_cons" UNIQUE CONSTRAINT, btree (id)
目前數據如下:
yqm=# select * from student;
id | name
----+------
1 | a
2 | b
3 | c
(3 rows)
要插入的表要有一條唯一性約束,不然會報如下錯:
yqm=# insert into student values(4,'d') on conflict(id) do update set name='as';
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
如果存在這種報錯,需要創建一條唯一性約束
yqm=# alter table student add constraint id_cons unique(id);
ALTER TABLE
再次插入
yqm=# insert into student values(4,'d') on conflict(id) do update set name='as';
INSERT 0 1
查看結果,已經新增了
yqm=# select * from student;
id | name
----+------
1 | a
2 | b
3 | c
4 | d
(4 rows)
再次執行,會做更改操作
yqm=# insert into student values(4,'d') on conflict(id) do update set name='as';
INSERT 0 1
yqm=# select * from student;
id | name
----+------
1 | a
2 | b
3 | c
4 | as
(4 rows)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。