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

首頁 > 數據庫 > PostgreSQL > 正文

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

2020-01-31 15:20:50
字體:
來源:轉載
供稿:網友

前言

就在 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 表的內容如下

執行批量的 insert

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

理看看 users 表中的內容

我們看到已存在行(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']));

這時候表中的內容為

從執行效果來看,它與下面的 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

再查看表的內容如下

 

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

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲美女福利视频网站| 国产美女被下药99| 国内精品模特av私拍在线观看| 正在播放国产一区| 欧美巨猛xxxx猛交黑人97人| 亚洲精品999| 亚洲人成网在线播放| 色与欲影视天天看综合网| 亚洲免费av网址| 日韩视频第一页| 久久久亚洲精品视频| 成人免费视频网| 中文国产成人精品久久一| 久久久国产精品视频| 欧美激情一级精品国产| 成人免费视频xnxx.com| 琪琪亚洲精品午夜在线| 国产一区二区在线免费视频| 国产精品日韩在线| 亚洲а∨天堂久久精品喷水| 亚洲丝袜一区在线| 亚洲国产成人久久综合| www.xxxx欧美| 国产一区二区三区在线播放免费观看| 中文在线资源观看视频网站免费不卡| 日韩欧美在线看| 国产精品18久久久久久麻辣| 国产精品情侣自拍| 亚洲黄色www| 久久九九全国免费精品观看| 中文精品99久久国产香蕉| 久久精品国产91精品亚洲| 日本电影亚洲天堂| 亚洲品质视频自拍网| 亚洲成人网久久久| 日韩av在线导航| 亚洲区在线播放| 亚洲丁香久久久| 欧美专区在线观看| 亚洲午夜久久久久久久| 国产精品视频不卡| 欧美成人国产va精品日本一级| 午夜精品久久久久久久99热浪潮| 欧美大片大片在线播放| 国产精品91一区| 韩日精品中文字幕| 久国内精品在线| 欧美激情欧美激情| 成人在线视频福利| 日韩电影在线观看免费| 亚洲成年人在线| 成人久久18免费网站图片| 欧美成人免费视频| 午夜精品在线视频| 不卡在线观看电视剧完整版| 久久久av一区| 国产精品一区二区3区| www.久久久久| 伊人久久久久久久久久| 亚洲天堂开心观看| 日韩成人av一区| 欧美日韩999| 亚洲精品成人免费| 欧美成人午夜激情在线| 中文国产成人精品久久一| 久久综合88中文色鬼| www.色综合| yellow中文字幕久久| 精品免费在线视频| 国产精品av网站| 久久综合久中文字幕青草| 国产精品jvid在线观看蜜臀| 日韩精品视频在线观看免费| 亚洲视频电影图片偷拍一区| 亚洲成人久久一区| 亚洲视频精品在线| 欧美亚洲国产视频| 久久久精品久久久| 亚洲成人激情小说| 国产精品91久久| 日本一区二区在线播放| 国模gogo一区二区大胆私拍| 日韩电影中文 亚洲精品乱码| www欧美日韩| 欧美中文字幕精品| 成人免费福利视频| 中文字幕欧美在线| 亚洲精品电影网| 日韩美女激情视频| 国产亚洲一区二区精品| 国产精品成人免费电影| 国产精品久久久久福利| 韩国v欧美v日本v亚洲| 91高清视频免费观看| 欧美精品生活片| 亚洲欧洲美洲在线综合| 上原亚衣av一区二区三区| 国产亚洲精品久久久久久牛牛| 国产一区二区三区中文| 国产精品一区二区三区久久| 国产精品自拍偷拍| 欧美日韩一区二区免费视频| 亚洲欧美制服第一页| 欧美夫妻性生活视频| 91精品久久久久久久久青青| 一本一本久久a久久精品综合小说| 日韩精品视频免费专区在线播放| 色偷偷av一区二区三区乱| 亚洲成人黄色在线观看| 亚洲美女视频网| 亚洲精品国偷自产在线99热| 欧美wwwwww| 亚洲免费伊人电影在线观看av| 欧美日韩国产在线看| 国产日韩欧美综合| 欧美激情免费看| 亚洲乱码av中文一区二区| 亚洲人成自拍网站| 亚洲欧美综合另类中字| 久久夜色精品国产欧美乱| 色黄久久久久久| 97在线看免费观看视频在线观看| 久久久亚洲影院你懂的| 国产精品激情自拍| 77777少妇光屁股久久一区| 成人激情视频在线| 国产乱人伦真实精品视频| 成人自拍性视频| 亚洲电影免费在线观看| 日韩电影中文字幕av| 国产精品视频导航| 日av在线播放中文不卡| 亚洲最新视频在线| xvideos亚洲人网站| 日韩成人在线免费观看| 午夜精品久久久久久久99热| 91日本在线视频| 亚洲欧洲日产国码av系列天堂| 在线日韩欧美视频| 国产精品成人av性教育| 色婷婷成人综合| 欧美另类暴力丝袜| 最近中文字幕2019免费| 国产亚洲精品日韩| 91精品久久久久久综合乱菊| 美日韩精品免费观看视频| 亚洲精品国产suv| 国产免费一区视频观看免费| 国产99视频精品免视看7| 国内精品视频一区| 国产a级全部精品| www.99久久热国产日韩欧美.com| 精品日韩视频在线观看| 97国产精品视频人人做人人爱| 久久影视电视剧凤归四时歌| 欧美日本亚洲视频| 91久久精品国产| 久久精品国产电影| 精品美女国产在线| 亚洲免费影视第一页| 国产精品99一区| 97精品久久久中文字幕免费| 亚洲天堂免费视频| 成人www视频在线观看|