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。
推薦閱讀:
- PostgreSQL upsert(插入更新)數據的操作詳解
- postgresql 實現replace into功能的代碼
- postgresql兼容MySQL on update current_timestamp問題
- SQL數據庫的所有命令(函數、運算符)匯總大全
- PostgreSQL自動更新時間戳實例代碼