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

upsert是一個組合詞,即當(dāng)往表中插入記錄,如果該記錄已存在則更新,否則插入新記錄。
postgresql 9.5版本之前實(shí)現(xiàn)upsert功能
語法
postgresql 9.5版本之前想實(shí)現(xiàn)upsert功能可以使用with語法來實(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,表中沒有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語法簡解)
那么是如何做到呢?
- 首先執(zhí)行update語句,如果找到滿足條件的數(shù)據(jù)就更新,并把該數(shù)據(jù)存放到upsert中,在執(zhí)行insert時(shí)就不滿足條件了;
- 如果找不到滿足條件的數(shù)據(jù),upsert中就是空的,在執(zhí)行insert語句時(shí)就滿足條件了。二者是互斥的。
postgresql 9.5版本之后實(shí)現(xiàn)upsert功能
語法
postgresql 9.5版本就可以使用INSERT ON CONFLICT語句了,語法如下:
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,表中沒有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語法簡解)
其實(shí)大體思路和之前還是一樣,就是9.5版本有了INSERT ON CONFLICT語句之后,使得書寫SQL更加簡單了,那就簡單解釋一下SQL語法中的兩個名詞吧。
target可以理解為目標(biāo)或者限制條件,一般是某個字段名。action是要做的具體操作,比如update、delete、do nothing等。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Postgresql 檢查數(shù)據(jù)庫主從復(fù)制進(jìn)度的操作
這篇文章主要介紹了Postgresql 檢查數(shù)據(jù)庫主從復(fù)制進(jìn)度的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
PostgreSQL自動更新時(shí)間戳實(shí)例代碼
最近有這么一個工程,需要使用postgresql數(shù)據(jù)庫,在數(shù)據(jù)庫中的好幾個表中都需要時(shí)間戳這個字段,這篇文章主要給大家介紹了關(guān)于PostgreSQL自動更新時(shí)間戳的相關(guān)資料,需要的朋友可以參考下2021-11-11
Postgresql源碼分析returns?setof函數(shù)oracle管道pipelined
這篇文章主要為大家介紹了Postgresql源碼分析returns?setof函數(shù)oracle管道pipelined,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
基于postgresql數(shù)據(jù)庫鎖表問題的解決
這篇文章主要介紹了基于postgresql數(shù)據(jù)庫鎖表問題的解決,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
解決postgresql 數(shù)字轉(zhuǎn)換成字符串前面會多出一個空格的問題
這篇文章主要介紹了解決postgresql 數(shù)字轉(zhuǎn)換成字符串前面會多出一個空格的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
sqoop讀取postgresql數(shù)據(jù)庫表格導(dǎo)入到hdfs中的實(shí)現(xiàn)
這篇文章主要介紹了sqoop讀取postgresql數(shù)據(jù)庫表格導(dǎo)入到hdfs中的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12

