十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
新遇到一個(gè)業(yè)務(wù)需求,往postgresql中插入數(shù)據(jù)的時(shí)候需滿足:如果數(shù)據(jù)庫存在這條記錄,則進(jìn)行修改;不存在則進(jìn)行插入。
成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)錫林浩特,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
Oracle中可以用merge來解決。Pg中之前沒做過類似操作,百度查了一下,PostgreSQL 9.5版本帶來了一個(gè)新特性:UPSERT。UPSERT是INSERT, ON CONFLICT UPDATE的簡(jiǎn)寫,簡(jiǎn)而言之就是:插入數(shù)據(jù),正常時(shí)寫入,主鍵沖突時(shí)更新。
示例來看一下:
一張測(cè)試表,結(jié)構(gòu)如下:
yqm=# \d student;
Table "public.student"
Column | Type | Modifiers
--------+-----------------------+-----------
id | integer |
name | character varying(20) |
Indexes:
"id_cons" UNIQUE CONSTRAINT, btree (id)
目前數(shù)據(jù)如下:
yqm=# select * from student;
id | name
----+------
1 | a
2 | b
3 | c
(3 rows)
要插入的表要有一條唯一性約束,不然會(huì)報(bào)如下錯(cuò):
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
如果存在這種報(bào)錯(cuò),需要?jiǎng)?chuàng)建一條唯一性約束
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
查看結(jié)果,已經(jīng)新增了
yqm=# select * from student;
id | name
----+------
1 | a
2 | b
3 | c
4 | d
(4 rows)
再次執(zhí)行,會(huì)做更改操作
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)