PostgreSQL upsert(插入更新)數(shù)據(jù)的操作詳解
本文介紹如何使用PostgreSQL upsert特性插入或當(dāng)被插入數(shù)據(jù)已存在則更新數(shù)據(jù)。
1. 介紹PostgreSQL upsert
在關(guān)系型數(shù)據(jù)庫中,upsert是一個(gè)組合詞,即當(dāng)往表中插入記錄,如果該記錄已存在則更新,否則插入新記錄。為了使用該特性需要使用INSERT ON CONFLICT
語句:
INSERT INTO table_name(column_list) VALUES(value_list) ON CONFLICT target action;
該語法中target
可以是下面列舉內(nèi)容之一:
- (column_name) – 列名
- ON CONSTRAINT constraint_name – 唯一約束的名稱
- WHERE predicate – 帶謂詞的where子句.
action
可能為下面兩者之一:
DO NOTHING – 如果行已存在表中,不執(zhí)行任何動作.
DO UPDATE SET column_1 = value_1, … WHERE condition – 更新表中一些字段.
注意:
ON CONFLICT
子句僅從PostgreSQL 9.5版本才有效。如果需用在之前版本,需要使用其他方法實(shí)現(xiàn)。
2. PostgreSQL upsert示例
下面語句創(chuàng)建customers表,演示PostgreSQL upsert特性:
DROP TABLE IF EXISTS customers; CREATE TABLE customers ( customer_id serial PRIMARY KEY, name VARCHAR UNIQUE, email VARCHAR NOT NULL, active bool NOT NULL DEFAULT TRUE );
customers 表包括四個(gè)字段customer_id, name, email, active,name字段有唯一約束確保名稱唯一。
下面插入語句新增幾條記錄:
INSERT INTO customers (name, email) VALUES ('IBM', 'contact@ibm.com'), ('Microsoft', 'contact@microsoft.com'), ('Intel', 'contact@intel.com');
假設(shè)現(xiàn)在Microsoft 修改email字段,從 contact@microsoft.com 到 hotline@microft.com。我們可以使用update更新語句,因?yàn)樾枰菔緐psert特性,這里使用INSERT ON CONFLICT
語句:
INSERT INTO customers (NAME, email) VALUES('Microsoft','hotline@microsoft.com') ON CONFLICT ON CONSTRAINT customers_name_key DO NOTHING;
上面語句表示如果名稱表中存在,則什么都不做。下面語句與上面等價(jià),但使用name列代替唯一約束名稱:
INSERT INTO customers (name, email) VALUES('Microsoft','hotline@microsoft.com') ON CONFLICT (name) DO NOTHING;
假設(shè)當(dāng)記錄已存在時(shí)你需要連接新的郵箱至原郵箱,這時(shí)update動作:
INSERT INTO customers (name, email) VALUES('Microsoft','hotline@microsoft.com') ON CONFLICT (name) DO UPDATE SET email = EXCLUDED.email || ';' || customers.email;
這里使用EXCLUDED虛擬表,其包含我們要更新的記錄,也就是新記錄(相對于原記錄customers)。等式右邊字段需要表名進(jìn)行區(qū)分,才不會報(bào)字段不明確錯誤。
讀者可以自行驗(yàn)證結(jié)果是否如你所愿。
3. 總結(jié)
本文介紹通過INSERT ON CONFLICT
實(shí)現(xiàn)PostgreSQL插入更新特性。
到此這篇關(guān)于PostgreSQL upsert(插入更新)教程詳解的文章就介紹到這了,更多相關(guān)PostgreSQL upsert內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
postgresql 存儲函數(shù)調(diào)用變量的3種方法小結(jié)
這篇文章主要介紹了postgresql 存儲函數(shù)調(diào)用變量的3種方法小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01postgresql的now()與Oracle的sysdate區(qū)別說明
這篇文章主要介紹了postgresql的now()與Oracle的sysdate區(qū)別說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12postgresql關(guān)于like%xxx%的優(yōu)化操作
這篇文章主要介紹了postgresql關(guān)于like%xxx%的優(yōu)化操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01PostgreSQL查看正在執(zhí)行的任務(wù)并強(qiáng)制結(jié)束的操作方法
這篇文章主要介紹了PostgreSQL查看正在執(zhí)行的任務(wù)并強(qiáng)制結(jié)束的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01PostgreSQL表膨脹監(jiān)控案例(精確計(jì)算)
這篇文章主要介紹了PostgreSQL表膨脹監(jiān)控案例(精確計(jì)算),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01Postgresql根據(jù)響應(yīng)數(shù)據(jù)反向?qū)崿F(xiàn)建表語句與insert語句的過程
根據(jù)已有數(shù)據(jù),可構(gòu)建名為products的表,包含id(自增主鍵)、title(非空字符串)、progress(非空整數(shù))三個(gè)字段,建表后,可通過insert語句插入數(shù)據(jù),這種反向操作有助于從現(xiàn)有數(shù)據(jù)結(jié)構(gòu)出發(fā),快速構(gòu)建數(shù)據(jù)庫表,并進(jìn)行數(shù)據(jù)填充,感興趣的朋友跟隨小編一起看看吧2022-02-02解決PostgreSQL服務(wù)啟動后占用100% CPU卡死的問題
前文書說到,今天耗費(fèi)了九牛二虎之力,終于馴服了NTFS權(quán)限安裝好了PostgreSQL,卻不曾想,服務(wù)啟動后,新的狀況又出現(xiàn)了。2009-08-08