最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PostgreSQL實(shí)現(xiàn)批量插入、更新與合并操作的方法

 更新時(shí)間:2019年02月12日 09:39:14   作者:隔葉黃鶯  
這篇文章主要給大家介紹了關(guān)于PostgreSQL實(shí)現(xiàn)批量插入、更新與合并操作的相關(guān)資料,文中通過圖文以及示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

就在 2019 年 1 月份微軟收購了 PostgreSQL 數(shù)據(jù)庫的初創(chuàng)公司 CitusData, 在云數(shù)據(jù)庫方面可以增強(qiáng)與 AWS 的竟?fàn)?。AWS 的 RDS 兩大開源數(shù)據(jù)庫就是 MySQL(Aurora 和 MariaDB 是它的變種) 和 PostgreSQL。

而 PostgreSQL 跳出了普通關(guān)系型數(shù)據(jù)庫的類型約束,它靈活的支持 JSON, JSONB, XML, 數(shù)組等類型。比如說字段類型可以是各種形式的數(shù)組,一維或多維。

create table t1(
 address varchar(5)[3],
 counter integer[3][3],
 schedule text[][]
)

上面只是認(rèn)識(shí)了一下 PostgreSQL 這一亮眼的特性,本篇重點(diǎn)不在如何定義操作數(shù)組類型的字段,而是對(duì)于普通的非數(shù)組字段類型如何用與數(shù)組相關(guān)的 unnest 關(guān)鍵字進(jìn)行記錄的批量插入,更新以及合并操作。

在正式使用介入 unnest 之前先熟悉一下 PostgreSQL 的 upsert(update insert) 操作。受其他數(shù)據(jù)庫的影響,總以后 PostgreSQL 也應(yīng)該支持 merge into 語句,而且竟然 PostgreSQL 官方也有文檔介紹 MERGE 有模有樣的,然而試了一下根本就不支持 merge into 操作。

普通的 insert upsert 操作

不過 PostgreSQL 有另一種 upsert 的語法,或稱之為 insert on conflict,也就是 PostgreSQL 加強(qiáng)版的 insert 語句。如下

INSERT INTO users (id, level)
VALUES (1, 0)
ON CONFLICT (id) DO UPDATE
SET level = users.level + 1;

即插入記錄時(shí)存在相同的主鍵可對(duì)原記錄的某些列進(jìn)行更新,否則插入該記錄。更詳細(xì)的 insert 語法請(qǐng)參考官方文檔 PostgreSQL INSERT。

注意到上面的 upsert 只是應(yīng)用于處理單條記錄,而本文將要討論到的是批量的處理。我們知道 insert 時(shí)可以同時(shí)插入多行記錄,那么這個(gè)  upsert 語法是否也能同時(shí)操作多行記錄呢?我們大膽假設(shè),小心求證,那就動(dòng)手一試吧

create table users(
 id int primary key,
 level int
)

創(chuàng)建一個(gè)表 users, 然后插入一條記錄

INSERT INTO users (id, level) VALUES (1, 0)

查詢 select * from users 表的內(nèi)容如下

執(zhí)行批量的 insert

INSERT INTO users (id, level)
VALUES (1, 3), (2, 1)
ON CONFLICT (id) DO UPDATE
SET level = excluded.level;

理看看 users 表中的內(nèi)容

我們看到已存在行(id=1) 的 level 更新為新的值 3, 并且插入新行。

這里注意到我們用到一個(gè)關(guān)鍵字 excluded 用于引用 INSERT 語句中 VALUES 提供的值,相應(yīng)的表名 users 用于引用表中原有的值。

基于 unnest 的 upsert 操作

前面仍然是寫作此文的意外收獲,實(shí)際上想要總結(jié)的是 unnest 關(guān)鍵字在批量操作中的作用。下面來進(jìn)行演示

create table testunnest(
  id int primary key,
 col1 int,
 col2 varchar(50)
)

創(chuàng)建一個(gè)表并用 unnest 提供并行數(shù)組來進(jìn)行批量插入

insert into testunnest(id, col1, col2) 
 values (unnest(array[1,2]), unnest(array[30,40]), unnest(array['val1', 'val2']));

這時(shí)候表中的內(nèi)容為

從執(zhí)行效果來看,它與下面的 insert 語句是等效的

insert into testunnest(id, col1, col2) values
 (1, 30, 'val1')
 (2, 40, 'val2')

換成成 unnest(array[..]) 的形式有一種行轉(zhuǎn)列的行為。

用 unnest 加上 unsert 再執(zhí)行一次插入

insert into testunnest(id, col1, col2)
 values (unnest(array[2,3]), unnest(array[80,90]), unnest(array['valupdated', 'val3']))
 on conflict (id) do update
 set col1 = excluded.col1, col2 = excluded.col2

再查看表的內(nèi)容如下

 

unnest 與 JDBC 操作

insert into users values (?, ?) on conflict.... 的 SQL 語句的單條記錄或批量操作(addBatch(), executeBatch()) 就不多說了,主要看下用 JDBC 怎么對(duì) unnest 進(jìn)行賦值操作。

PreparedStatement pstmt = conn.prepareStatement(
 "INSERT INTO testunnest(id, col1, col2) " +
  " VALUES (unnest(?), unnest(?), unnest(?))" +
  " ON CONFLICT (id) DO UPDATE" +
  " SET col1 = excluded.col1, col2 = excluded.col2"
);
 
pstmt.setArray(1, conn.createArrayOf("int", new Integer[]{2, 3}));
pstmt.setArray(2, conn.createArrayOf(JDBCType.INTEGER.getName(), new Integer[]{80, 90}));
pstmt.setArray(3, conn.createArrayOf("varchar", new String[]{"val1", "val2"}));
 
int update = pstmt.executeUpdate();
System.out.println(update); //影響的記錄數(shù)是 2

點(diǎn)位符要用 unnest(?),設(shè)置參數(shù)時(shí)要用 setArray(), 參數(shù)用 conn.createArrayOf(type, array) 來指定。需要指明數(shù)組中的元素類型,這么普通的 setInt(), setString() 是一個(gè)意思。

用不著轉(zhuǎn)換為 PostgreSQL 特定的 PreparedStatement 來操作,用 JDBC 通用的 PreparedStatement 接口就能支持對(duì)數(shù)組類型的賦值,難道是其他類型的數(shù)據(jù)庫也能支持類似的數(shù)組操作?

鏈接:

Upsert Records with PostgresSQL 9.5

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Postgresql常用函數(shù)及使用方法大全(看一篇就夠了)

    Postgresql常用函數(shù)及使用方法大全(看一篇就夠了)

    使用函數(shù)可以極大的提高用戶對(duì)數(shù)據(jù)庫的管理效率,函數(shù)表示輸入?yún)?shù)表示一個(gè)具有特定關(guān)系的值,下面這篇文章主要給大家介紹了關(guān)于Postgresql常用函數(shù)及使用方法的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • PotgreSQL?基于時(shí)間點(diǎn)恢復(fù)過程

    PotgreSQL?基于時(shí)間點(diǎn)恢復(fù)過程

    本篇文章介紹?PostgreSQL?基于時(shí)間點(diǎn)恢復(fù)(point-in-time-recover)需要的條件及恢復(fù)過程,屬于操作說明,對(duì)PotgreSQL?時(shí)間點(diǎn)恢復(fù)相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • 對(duì)Postgresql中的json和array使用介紹

    對(duì)Postgresql中的json和array使用介紹

    這篇文章主要介紹了對(duì)Postgresql中的json和array使用介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL實(shí)現(xiàn)按年、月、日、周、時(shí)、分、秒的分組統(tǒng)計(jì)

    PostgreSQL實(shí)現(xiàn)按年、月、日、周、時(shí)、分、秒的分組統(tǒng)計(jì)

    這篇文章介紹了PostgreSQL實(shí)現(xiàn)按年、月、日、周、時(shí)、分、秒分組統(tǒng)計(jì)的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 詳解如何診斷和解決PostgreSQL中的死鎖問題

    詳解如何診斷和解決PostgreSQL中的死鎖問題

    在數(shù)據(jù)庫系統(tǒng)中,死鎖是一個(gè)常見但棘手的問題,PostgreSQL 也不例外,如果不及時(shí)診斷和解決,死鎖可能會(huì)導(dǎo)致系統(tǒng)性能嚴(yán)重下降,甚至應(yīng)用程序的崩潰,本文將詳細(xì)探討如何診斷和解決 PostgreSQL 中的死鎖問題,需要的朋友可以參考下
    2024-07-07
  • Postgresql 數(shù)據(jù)庫 varchar()字符占用多少字節(jié)介紹

    Postgresql 數(shù)據(jù)庫 varchar()字符占用多少字節(jié)介紹

    這篇文章主要介紹了Postgresql 數(shù)據(jù)庫 varchar()字符占用多少字節(jié)介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • pgsql查詢優(yōu)化之模糊查詢實(shí)例詳解

    pgsql查詢優(yōu)化之模糊查詢實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于pgsql查詢優(yōu)化之模糊查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用pgsql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • postgresql 實(shí)現(xiàn)更新序列的起始值

    postgresql 實(shí)現(xiàn)更新序列的起始值

    這篇文章主要介紹了postgresql 實(shí)現(xiàn)更新序列的起始值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • PostgreSQL 恢復(fù)誤刪數(shù)據(jù)的操作

    PostgreSQL 恢復(fù)誤刪數(shù)據(jù)的操作

    這篇文章主要介紹了PostgreSQL 恢復(fù)誤刪數(shù)據(jù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 詳解如何定位postgreSQL數(shù)據(jù)庫中未被使用過的索引

    詳解如何定位postgreSQL數(shù)據(jù)庫中未被使用過的索引

    在生產(chǎn)環(huán)境上,由于不規(guī)范的優(yōu)化措施,數(shù)據(jù)庫中可能存在大量的索引,并且相當(dāng)一部分的索引重未被使用過,今天帶大家如何找出這些索引,本文給大家介紹了定位postgreSQL數(shù)據(jù)庫中未被使用過的索引的方法,需要的朋友可以參考下
    2024-03-03

最新評(píng)論

乐平市| 开阳县| 察雅县| 凉城县| 富宁县| 泉州市| 石棉县| 呼伦贝尔市| 长春市| 家居| 张家川| 司法| 雷波县| 洮南市| 搜索| 光泽县| 米林县| 镇赉县| 万州区| 沈阳市| 东明县| 墨玉县| 务川| 玉林市| 苏州市| 沐川县| 阿鲁科尔沁旗| 沙湾县| 平顺县| 左权县| 吉首市| 涪陵区| 息烽县| 邹平县| 遂宁市| 闸北区| 西青区| 江阴市| 调兵山市| 呼伦贝尔市| 彭泽县|