postgresql無(wú)則插入,有則更新問(wèn)題
準(zhǔn)備工作
我們只需要準(zhǔn)備一張表??

upsert是一個(gè)組合詞,即當(dāng)往表中插入記錄,如果該記錄已存在則更新,否則插入新記錄。
postgresql 9.5版本之前實(shí)現(xiàn)upsert功能
語(yǔ)法
postgresql 9.5版本之前想實(shí)現(xiàn)upsert功能可以使用with語(yǔ)法來(lái)實(shí)現(xiàn)。
實(shí)例
SQL如下
WITH UPSERT
AS ( UPDATE org SET org_name = '復(fù)仇者聯(lián)盟2', modify_time = now() WHERE org_id = 2 RETURNING *)
INSERT
INTO org (org_id, org_no, org_name)
SELECT 2,
'002',
'復(fù)仇者聯(lián)盟'
WHERE NOT EXISTS(SELECT 1 FROM upsert WHERE org_id = 2);
第一次執(zhí)行SQL,表中沒(méi)有org_id為2的數(shù)據(jù),則插入一條新數(shù)據(jù)。

執(zhí)行成功了,刷新一下表,可以看到插入了一條新數(shù)據(jù)。

再次執(zhí)行SQL,這時(shí)表中已經(jīng)有一條為org_id為2的數(shù)據(jù)了,那么則更新數(shù)據(jù)。

刷新表,可以看到更新了org_name和modify_time字段。

嘚吧嘚(SQL語(yǔ)法簡(jiǎn)解)
那么是如何做到呢?
- 首先執(zhí)行update語(yǔ)句,如果找到滿足條件的數(shù)據(jù)就更新,并把該數(shù)據(jù)存放到upsert中,在執(zhí)行insert時(shí)就不滿足條件了;
- 如果找不到滿足條件的數(shù)據(jù),upsert中就是空的,在執(zhí)行insert語(yǔ)句時(shí)就滿足條件了。二者是互斥的。
postgresql 9.5版本之后實(shí)現(xiàn)upsert功能
語(yǔ)法
postgresql 9.5版本就可以使用INSERT ON CONFLICT語(yǔ)句了,語(yǔ)法如下:
insert into table_name(column_list) values(value_list) on conflict target action;
實(shí)例
SQL如下:
insert into org(org_id, org_no, org_name)
values (3, '003', '銀河護(hù)衛(wèi)隊(duì)')
on conflict(org_id) do update set org_name='銀河護(hù)衛(wèi)隊(duì)2',
modify_time=now();
第一次執(zhí)行SQL,表中沒(méi)有org_id為3的數(shù)據(jù),則插入一條新數(shù)據(jù)。

執(zhí)行成功了,刷新一下表,可以看到插入了一條新數(shù)據(jù)。

第二次執(zhí)行SQL,這時(shí)表中已經(jīng)有一條為org_id為3的數(shù)據(jù)了,那么則更新數(shù)據(jù)。

可以看到更新了org_name和modify_time字段。

嘚吧嘚(SQL語(yǔ)法簡(jiǎn)解)
其實(shí)大體思路和之前還是一樣,就是9.5版本有了INSERT ON CONFLICT語(yǔ)句之后,使得書(shū)寫(xiě)SQL更加簡(jiǎn)單了,那就簡(jiǎn)單解釋一下SQL語(yǔ)法中的兩個(gè)名詞吧。
target可以理解為目標(biāo)或者限制條件,一般是某個(gè)字段名。action是要做的具體操作,比如update、delete、do nothing等。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Postgresql 檢查數(shù)據(jù)庫(kù)主從復(fù)制進(jìn)度的操作
這篇文章主要介紹了Postgresql 檢查數(shù)據(jù)庫(kù)主從復(fù)制進(jìn)度的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
PostgreSQL自動(dòng)更新時(shí)間戳實(shí)例代碼
最近有這么一個(gè)工程,需要使用postgresql數(shù)據(jù)庫(kù),在數(shù)據(jù)庫(kù)中的好幾個(gè)表中都需要時(shí)間戳這個(gè)字段,這篇文章主要給大家介紹了關(guān)于PostgreSQL自動(dòng)更新時(shí)間戳的相關(guān)資料,需要的朋友可以參考下2021-11-11
Postgresql源碼分析returns?setof函數(shù)oracle管道pipelined
這篇文章主要為大家介紹了Postgresql源碼分析returns?setof函數(shù)oracle管道pipelined,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Postgresql通過(guò)查詢進(jìn)行更新的操作
這篇文章主要介紹了Postgresql通過(guò)查詢進(jìn)行更新的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
基于postgresql數(shù)據(jù)庫(kù)鎖表問(wèn)題的解決
這篇文章主要介紹了基于postgresql數(shù)據(jù)庫(kù)鎖表問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
解決postgresql 數(shù)字轉(zhuǎn)換成字符串前面會(huì)多出一個(gè)空格的問(wèn)題
這篇文章主要介紹了解決postgresql 數(shù)字轉(zhuǎn)換成字符串前面會(huì)多出一個(gè)空格的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
sqoop讀取postgresql數(shù)據(jù)庫(kù)表格導(dǎo)入到hdfs中的實(shí)現(xiàn)
這篇文章主要介紹了sqoop讀取postgresql數(shù)據(jù)庫(kù)表格導(dǎo)入到hdfs中的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12

