本文介紹如何使用PostgreSQL upsert特性插入或當(dāng)被插入數(shù)據(jù)已存在則更新數(shù)據(jù)。
1. 介紹PostgreSQL upsert
在關(guān)系型數(shù)據(jù)庫(kù)中,upsert是一個(gè)組合詞,即當(dāng)往表中插入記錄,如果該記錄已存在則更新,否則插入新記錄。為了使用該特性需要使用INSERT ON CONFLICT語(yǔ)句:
INSERT INTO table_name(column_list)
VALUES(value_list)
ON CONFLICT target action;
該語(yǔ)法中target可以是下面列舉內(nèi)容之一:
- (column_name) – 列名
- ON CONSTRAINT constraint_name – 唯一約束的名稱(chēng)
- 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示例
下面語(yǔ)句創(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字段有唯一約束確保名稱(chēng)唯一。
下面插入語(yǔ)句新增幾條記錄:
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ǔ)句,因?yàn)樾枰菔緐psert特性,這里使用INSERT ON CONFLICT語(yǔ)句:
INSERT INTO customers (NAME, email)
VALUES('Microsoft','hotline@microsoft.com')
ON CONFLICT ON CONSTRAINT customers_name_key
DO NOTHING;
上面語(yǔ)句表示如果名稱(chēng)表中存在,則什么都不做。下面語(yǔ)句與上面等價(jià),但使用name列代替唯一約束名稱(chēng):
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虛擬表,其包含我們要更新的記錄,也就是新記錄(相對(duì)于原記錄customers)。等式右邊字段需要表名進(jìn)行區(qū)分,才不會(huì)報(bào)字段不明確錯(cuò)誤。
讀者可以自行驗(yàn)證結(jié)果是否如你所愿。
3. 總結(jié)
本文介紹通過(guò)INSERT ON CONFLICT實(shí)現(xiàn)PostgreSQL插入更新特性。
到此這篇關(guān)于PostgreSQL upsert(插入更新)教程詳解的文章就介紹到這了,更多相關(guān)PostgreSQL upsert內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- 使用postgresql 模擬批量數(shù)據(jù)插入的案例
- 使用Postgresql 實(shí)現(xiàn)快速插入測(cè)試數(shù)據(jù)
- postgreSQL數(shù)據(jù)庫(kù) 實(shí)現(xiàn)向表中快速插入1000000條數(shù)據(jù)
- Python隨機(jī)生成數(shù)據(jù)后插入到PostgreSQL
- postgres 使用存儲(chǔ)過(guò)程批量插入數(shù)據(jù)的操作