postgresql無則插入,有則更新問題

準備工作

我們隻需要準備一張表😉

在這裡插入圖片描述

upsert是一個組合詞,即當往表中插入記錄,如果該記錄已存在則更新,否則插入新記錄。

postgresql 9.5版本之前實現upsert功能

語法

postgresql 9.5版本之前想實現upsert功能可以使用with語法來實現。

實例

SQL如下

WITH UPSERT
         AS ( UPDATE org SET org_name = '復仇者聯盟2', modify_time = now() WHERE org_id = 2 RETURNING *)
INSERT
INTO org (org_id, org_no, org_name)
SELECT 2,
       '002',
       '復仇者聯盟'
WHERE NOT EXISTS(SELECT 1 FROM upsert WHERE org_id = 2);

第一次執行SQL,表中沒有org_id為2的數據,則插入一條新數據。

在這裡插入圖片描述

執行成功瞭,刷新一下表,可以看到插入瞭一條新數據。

在這裡插入圖片描述

再次執行SQL,這時表中已經有一條為org_id為2的數據瞭,那麼則更新數據。

在這裡插入圖片描述

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

在這裡插入圖片描述

嘚吧嘚(SQL語法簡解)

那麼是如何做到呢?

  • 首先執行update語句,如果找到滿足條件的數據就更新,並把該數據存放到upsert中,在執行insert時就不滿足條件瞭;
  • 如果找不到滿足條件的數據,upsert中就是空的,在執行insert語句時就滿足條件瞭。二者是互斥的。

postgresql 9.5版本之後實現upsert功能

語法

postgresql 9.5版本就可以使用INSERT ON CONFLICT語句瞭,語法如下:

insert into table_name(column_list) 
values(value_list)
on conflict target action;

實例

SQL如下:

insert into org(org_id, org_no, org_name)
values (3, '003', '銀河護衛隊')
on conflict(org_id) do update set org_name='銀河護衛隊2',
                                  modify_time=now();

第一次執行SQL,表中沒有org_id為3的數據,則插入一條新數據。

在這裡插入圖片描述

執行成功瞭,刷新一下表,可以看到插入瞭一條新數據。

在這裡插入圖片描述

第二次執行SQL,這時表中已經有一條為org_id為3的數據瞭,那麼則更新數據。

在這裡插入圖片描述

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

在這裡插入圖片描述

嘚吧嘚(SQL語法簡解)

其實大體思路和之前還是一樣,就是9.5版本有瞭INSERT ON CONFLICT語句之後,使得書寫SQL更加簡單瞭,那就簡單解釋一下SQL語法中的兩個名詞吧。

  • target可以理解為目標或者限制條件,一般是某個字段名。
  • action是要做的具體操作,比如update、delete、do nothing等。

總結

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: