亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > PostgreSQL > 正文

PostgreSQL實現批量插入、更新與合并操作的方法

2020-03-12 23:45:12
字體:
來源:轉載
供稿:網友

前言

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

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

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

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

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

普通的 insert upsert 操作

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

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

即插入記錄時存在相同的主鍵可對原記錄的某些列進行更新,否則插入該記錄。更詳細的 insert 語法請參考官方文檔 PostgreSQL INSERT

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

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

創建一個表 users, 然后插入一條記錄

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

查詢 select * from users 表的內容如下

PostgreSQL,批量,插入,更新,合并

執行批量的 insert

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

理看看 users 表中的內容

PostgreSQL,批量,插入,更新,合并

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

這里注意到我們用到一個關鍵字 excluded 用于引用 INSERT 語句中 VALUES 提供的值,相應的表名 users 用于引用表中原有的值。

基于 unnest 的 upsert 操作

前面仍然是寫作此文的意外收獲,實際上想要總結的是 unnest 關鍵字在批量操作中的作用。下面來進行演示

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

創建一個表并用 unnest 提供并行數組來進行批量插入

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

這時候表中的內容為

PostgreSQL,批量,插入,更新,合并

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

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

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

用 unnest 加上 unsert 再執行一次插入

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

再查看表的內容如下

PostgreSQL,批量,插入,更新,合并

unnest 與 JDBC 操作

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

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); //影響的記錄數是 2

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

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

鏈接:

Upsert Records with PostgresSQL 9.5

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到PostgreSQL頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色妞欧美日韩在线| 久久这里有精品视频| 久久久久久久网站| 亚洲欧美变态国产另类| 欧美日韩国产成人在线观看| 欧美一级大片在线观看| 成人黄色大片在线免费观看| 欧美精品一区在线播放| 久久精品2019中文字幕| 亚洲欧美另类在线观看| 午夜精品久久17c| 久久视频在线看| 久久偷看各类女兵18女厕嘘嘘| 亚洲第一精品夜夜躁人人爽| 国产亚洲精品久久久优势| www.久久撸.com| 日韩中文字幕精品| 亚洲精品国产精品乱码不99按摩| 国产亚洲一区二区在线| 日韩亚洲一区二区| 国产精品久久久av久久久| 奇米四色中文综合久久| 国产精品男人爽免费视频1| 欧美性猛交xxxx黑人猛交| 狠狠综合久久av一区二区小说| 国产69精品99久久久久久宅男| 国产综合视频在线观看| 中国人与牲禽动交精品| 国产成人一区三区| 91国产精品91| 亚洲人高潮女人毛茸茸| 久久国产精品久久久久| 中文字幕亚洲一区二区三区| 国产精品久久97| 国产婷婷色综合av蜜臀av| 欧美性jizz18性欧美| 欧美www在线| 日韩福利伦理影院免费| 亚洲欧美国内爽妇网| 欧美国产亚洲视频| 中文字幕在线看视频国产欧美在线看完整| 日韩免费观看在线观看| 久久久久久久一区二区| 精品国产老师黑色丝袜高跟鞋| 亚洲欧美中文在线视频| 久久99热精品这里久久精品| 亚洲少妇激情视频| 日韩经典中文字幕| 久久69精品久久久久久久电影好| 俺去啦;欧美日韩| 亚洲精品乱码久久久久久金桔影视| 久久久久久一区二区三区| 亚洲国产精品久久久久| 在线观看精品自拍私拍| 欧美色图在线视频| 欧美老肥婆性猛交视频| 欧美剧在线观看| 欧美在线视频免费| 亚洲欧美日韩一区二区在线| 最近中文字幕mv在线一区二区三区四区| 亚洲欧洲午夜一线一品| 这里只有精品在线播放| 亚洲欧美日韩精品久久亚洲区| 国产精品久久久久久久av电影| 亚洲日本aⅴ片在线观看香蕉| xxx欧美精品| 国产精品极品在线| 国产欧美日韩中文字幕| 国产日韩专区在线| 久久成人亚洲精品| 国产欧美日韩中文字幕在线| 精品无人国产偷自产在线| 亚洲成人av资源网| 中文字幕亚洲一区在线观看| 欧美在线视频在线播放完整版免费观看| 欧美激情性做爰免费视频| 国产日韩av在线| 欧美xxxx做受欧美| 国产经典一区二区| 日韩成人中文字幕在线观看| 日本韩国欧美精品大片卡二| 中文字幕欧美亚洲| 亚洲丁香久久久| 国产精品香蕉在线观看| 亚洲午夜未删减在线观看| 69久久夜色精品国产69乱青草| 国产日韩一区在线| 伊人伊成久久人综合网站| 日韩精品久久久久久福利| 欧美日韩激情视频| 精品福利在线观看| 伊人久久久久久久久久久| 日韩av一区二区在线| 国内久久久精品| 久久全国免费视频| 国产综合久久久久久| 欧美性xxxxxx| 久久中国妇女中文字幕| 青青草精品毛片| 国产亚洲精品高潮| 亚洲国产精品yw在线观看| 久久这里只有精品99| 欧美精品久久久久久久久久| 96精品久久久久中文字幕| 国产精品自产拍在线观| 国产日韩精品视频| 亚洲激情在线观看| 国产视频在线观看一区二区| 亚洲天堂第一页| 久久久久亚洲精品成人网小说| 精品自在线视频| 国产丝袜一区二区| 一本一道久久a久久精品逆3p| 国产精品久久综合av爱欲tv| 亚洲第一天堂av| 国产精品电影在线观看| 国产精品激情av电影在线观看| 国产成人福利夜色影视| 欧美色xxxx| 亚洲国产精品va在线看黑人动漫| 色播久久人人爽人人爽人人片视av| 欧美大片在线看免费观看| 成人免费观看a| 精品成人乱色一区二区| 亚洲午夜av久久乱码| 国产午夜精品美女视频明星a级| 国产精品 欧美在线| 久久精品视频亚洲| 欧美激情视频播放| 精品亚洲一区二区三区四区五区| 亚洲欧美一区二区三区四区| 中文字幕在线成人| 国产视频精品一区二区三区| 久久久久国产精品免费网站| 欧美日韩福利在线观看| 精品国产一区二区三区久久久| 国产精品偷伦视频免费观看国产| 欧美亚洲国产视频小说| yw.139尤物在线精品视频| 国产午夜精品美女视频明星a级| 91在线中文字幕| 国产精品极品尤物在线观看| 日韩视频在线观看免费| 美乳少妇欧美精品| 国产手机视频精品| 亚洲午夜小视频| 中文字幕日韩欧美在线| 色偷偷88888欧美精品久久久| 日本韩国欧美精品大片卡二| 国产精品久久久久久av下载红粉| 亚洲精品乱码久久久久久金桔影视| 欧美日韩免费观看中文| 国产精品成人一区| 久久全球大尺度高清视频| 中文字幕av一区二区| 成人网在线免费看| 欧美一级黄色网| 精品小视频在线| 亚洲欧洲国产伦综合| 伊人久久综合97精品| 欧美日韩国产成人在线观看| 日韩精品在线播放| 欧美成人久久久| 国产色婷婷国产综合在线理论片a|