您好,登錄后才能下訂單哦!
如何在PostgreSQL數(shù)據(jù)庫中實(shí)現(xiàn)upsert數(shù)據(jù)操作?針對這個(gè)問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。
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í)行任何動(dòng)作.
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動(dòng)作:
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ū)分,才不會(huì)報(bào)字段不明確錯(cuò)誤。
讀者可以自行驗(yàn)證結(jié)果是否如你所愿。
關(guān)于如何在PostgreSQL數(shù)據(jù)庫中實(shí)現(xiàn)upsert數(shù)據(jù)操作問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。