佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > PostgreSQL upsert(插入更新)數(shù)據(jù)的操作詳解

PostgreSQL upsert(插入更新)數(shù)據(jù)的操作詳解

熱門標簽:AI電銷 百度競價排名 網(wǎng)站排名優(yōu)化 服務(wù)外包 鐵路電話系統(tǒng) Linux服務(wù)器 呼叫中心市場需求 地方門戶網(wǎng)站

本文介紹如何使用PostgreSQL upsert特性插入或當被插入數(shù)據(jù)已存在則更新數(shù)據(jù)。

1. 介紹PostgreSQL upsert

在關(guān)系型數(shù)據(jù)庫中,upsert是一個組合詞,即當往表中插入記錄,如果該記錄已存在則更新,否則插入新記錄。為了使用該特性需要使用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版本才有效。如果需用在之前版本,需要使用其他方法實現(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 表包括四個字段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更新語句,因為需要演示upsert特性,這里使用INSERT ON CONFLICT語句:

INSERT INTO customers (NAME, email)
VALUES('Microsoft','hotline@microsoft.com') 
ON CONFLICT ON CONSTRAINT customers_name_key 
DO NOTHING;

上面語句表示如果名稱表中存在,則什么都不做。下面語句與上面等價,但使用name列代替唯一約束名稱:

INSERT INTO customers (name, email)
VALUES('Microsoft','hotline@microsoft.com') 
ON CONFLICT (name) 
DO NOTHING;

假設(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)。等式右邊字段需要表名進行區(qū)分,才不會報字段不明確錯誤。
讀者可以自行驗證結(jié)果是否如你所愿。

3. 總結(jié)

本文介紹通過INSERT ON CONFLICT實現(xiàn)PostgreSQL插入更新特性。

到此這篇關(guān)于PostgreSQL upsert(插入更新)教程詳解的文章就介紹到這了,更多相關(guān)PostgreSQL upsert內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 使用postgresql 模擬批量數(shù)據(jù)插入的案例
  • 使用Postgresql 實現(xiàn)快速插入測試數(shù)據(jù)
  • postgreSQL數(shù)據(jù)庫 實現(xiàn)向表中快速插入1000000條數(shù)據(jù)
  • Python隨機生成數(shù)據(jù)后插入到PostgreSQL
  • postgres 使用存儲過程批量插入數(shù)據(jù)的操作

標簽:衡水 黃山 湘潭 仙桃 蘭州 崇左 銅川 湖南

巨人網(wǎng)絡(luò)通訊聲明:本文標題《PostgreSQL upsert(插入更新)數(shù)據(jù)的操作詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    永定县| 宁乡县| 法库县| 平南县| 剑河县| 马鞍山市| 慈溪市| 阿尔山市| 本溪市| 阿巴嘎旗| 祥云县| 涡阳县| 盘锦市| 丘北县| 蛟河市| 广宁县| 杭锦后旗| 南部县| 绥滨县| 赤水市| 太仆寺旗| 正阳县| 安仁县| 惠水县| 高碑店市| 柘荣县| 宁津县| 吉首市| 理塘县| 黑水县| 溆浦县| 红原县| 芜湖县| 尚义县| 聂荣县| 新田县| 民县| 伊吾县| 宣城市| 栖霞市| 迭部县|