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模式匹配與正則表達(dá)式方法總結(jié)
在postgresql中使用正則表達(dá)式時(shí)需要使用關(guān)鍵字“~”,以表示該關(guān)鍵字之前的內(nèi)容需匹配之后的正則表達(dá)式,這篇文章主要給大家介紹了關(guān)于PostgreSQL模式匹配與正則表達(dá)式的相關(guān)資料,需要的朋友可以參考下2022-11-11PostgreSQL生成列實(shí)現(xiàn)過程介紹
PostgreSQL 12 增加新的特性——生成列(Generated Columns),也就是計(jì)算列。在之前版本也可以實(shí)現(xiàn),但需要定義函數(shù)和觸發(fā)器,利用該功能可以更容易使用并可以提升性能。生成列是給表指定計(jì)算列,其數(shù)據(jù)可以根據(jù)其他列數(shù)據(jù)自動生成,當(dāng)原數(shù)據(jù)更新時(shí)其自動更新2023-01-01PostgreSQL 分頁查詢時(shí)間的2種比較方法小結(jié)
這篇文章主要介紹了PostgreSQL 分頁查詢時(shí)間的2種比較方法小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12PostgreSQL運(yùn)維案例之遞歸查詢死循環(huán)解決方案
PostgreSQL提供的遞歸語法是很棒的,例如可用來解決樹形查詢的問題,解決Oracle用戶connect by的語法兼容性,下面這篇文章主要給大家介紹了關(guān)于PostgreSQL運(yùn)維案例之遞歸查詢死循環(huán)解決方案的相關(guān)資料,需要的朋友可以參考下2024-02-02Postgresql在mybatis中報(bào)錯:操作符不存在:character varying == unknown的問題
這篇文章主要介紹了Postgresql在mybatis中報(bào)錯: 操作符不存在 character varying == unknown的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01詳解PostgreSQL 實(shí)現(xiàn)定時(shí)任務(wù)的 4 種方法
這篇文章主要介紹了PostgreSQL 實(shí)現(xiàn)定時(shí)任務(wù)的 4 種方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02