PostgreSQL?數(shù)組類型操作使用及特點詳解
PostgreSQL 數(shù)組類型使用詳解
可能大家對 PostgreSQL這個關系型數(shù)據(jù)庫不太熟悉,因為大部分人最熟悉的,公司用的最多的是 MySQL
我們先對PostgreSQL數(shù)據(jù)庫 (下面簡稱 PG)簡單的介紹一下,以后有機會,再單獨寫一篇專門介紹pgSql的文章
The World's Most Advanced Open Source Relational Database
這是PG官網(wǎng)對自己的介紹,是的,你沒有看錯,“世界上最先進的開源關系型數(shù)據(jù)庫”。一段嚴重違反我國廣告法的話,上一個敢那么叫囂的技術是PHP,“世界上最好的語言”,然后這句話就成了碼農界最廣為人知的梗,存在于各種笑料中。
不過PG并沒有因為這樣明目張膽地自吹自擂而遭到什么抨擊或調侃,事實上,無論在務實的碼農界,抑或是講究章法的學術界,人們對PG都是贊許有加,PG是完全當?shù)闷疬@句話的。
下面列出一些PostgreSQL的特點
- PostgreSQL是一種功能非常齊全關系型數(shù)據(jù)庫,由加州大學計算機系開發(fā)
- PostgreSQL開源協(xié)議是類BSD的自有協(xié)議 ,這是一種非常友好的協(xié)議,不論是商用還是自用,或者修改代碼再起個名拿來賣錢,都沒有任何風險
- PostgreSQL支持的數(shù)據(jù)類型非常多,除了常用的,還有枚舉類型, 幾何類型,UUID類型 , json類型 , 數(shù)組類型 等,其中數(shù)組類型 也是本篇文章的目的,介紹其中數(shù)組類型的使用
- PostgreSQL 成立時對標的數(shù)據(jù)庫是
Oracle數(shù)據(jù)庫,所有 PostgreSQL 的功能和性能是非常強的。 - PostgreSQL 對復雜SQL的執(zhí)行,要好于MySql
- ..................
還有很多的特性,這里只簡單的寫幾個,上面的幾個特點也是我非常在意的,之所 www.helloworld.net 此次改版把Mysql換成了PostgreSQL ,就是有這些原因。
之前很多人問過,hellworld開發(fā)者社區(qū) 改版用到了哪些技術棧,其中之一,就是把 Mysql 換成了 PostgreSQL
在改版的過程中,所有的表全部重新設計,這對于后端來說,是一個極其需要勇氣的決定,好在我們堅持下來了
在改的過程中,其中有這樣一個場景:
一篇博客,有多個標簽 ,比如 一個博客,有多線程, 并發(fā) , 線程池 這三個標簽
對于這樣的需求,我們可以分析一下
- 一篇博客,有多個標簽
- 一個標簽,也可有對應多篇博客
這樣就形成了 多對多 的關系,建表的話,就會有一張關聯(lián)表,大部分會想到這樣建表
博客表: blog
標簽表: tag
標簽博客表: tag_blog
其中各表的字段,如下(簡單起見,只列出最少的列):
blog 表:
- id 數(shù)字類型,博客的 id, 自增長的主鍵
- title 字符串類型,博客的標題
tag表:
- id 數(shù)字類型, 標簽的 id , 自增長的主鍵
- name 字符串類型,標簽的名字
tag_blog :
- id 數(shù)字類型, 自增長的主鍵
- tag_id 標簽 id (對應 tag 表中的 id )
- blog_id 博客id (對應 blog 表中的 id )
上面這個博客標簽需求,需要 3 張表,我們知道,PostgreSQL 的列的類型是支持數(shù)組類型的
我們是不是可以優(yōu)化一下上面的需求,把 3 張表變成 1 張表
只保留一張 blog 表,在 blog 表中增加一列 tags , 類似就是 text[ ]
新的博客表字段如下:
blog表:
- id 數(shù)字類型(bigint),博客的 id, 自增長的主鍵
- title 字符串類型(text ),博客的標題
- tags 字符串數(shù)組類型(text[ ] )
為了方便大家測試,建表SQL 如下
CREATE TABLE IF NOT EXISTS public.blog
(
id bigint NOT NULL DEFAULT nextval('blog_id_seq'::regclass),
title text COLLATE pg_catalog."default",
tags text[] COLLATE pg_catalog."default",
CONSTRAINT blog_pkey PRIMARY KEY (id)
)
TABLESPACE pg_default;
ALTER TABLE IF EXISTS public.blog
OWNER to postgres;
下面我們針對 tags 字段作一些基本操作
數(shù)組類型的基本操作
1 查詢
現(xiàn)在表中沒有數(shù)據(jù),我們查詢一下看看
select * from blog
結果如下:

2 插入數(shù)據(jù)
插入一條記錄,標題是 www.helloworld.net , 對應的標簽有3個,分別是 helloworld , 技術 , 社區(qū)
insert into blog (title,tags) values('www.helloworld.net','{"helloworld","技術","社區(qū)"}')
再次查詢
select * from blog
結果如下:

可以看到,已經(jīng)有了一條數(shù)據(jù)了,tags 數(shù)組里面有3個元素,分別是 helloworld , 技術 , 社區(qū)
我們再次插入兩條數(shù)據(jù),方便我們測試
insert into blog (title,tags) values('www.juejin.im','{"掘金","技術","開發(fā)者"}');
insert into blog (title,tags) values('www.oschina.net','{"開源中國","oschina","開源"}');
查詢結果如下:

3 條件查詢
3.1 查詢標簽中有 技術標簽的博客
語法 select * from blog where 'xx' = any(數(shù)組字段)
sql 語句如下
select * from blog where '技術'= any(tags)
查詢結果如下:

3.2 查詢標簽中有 helloworld標簽或者有 開源中國標簽的博客
sql語句如下:
select * from blog where 'helloworld'= any(tags) or '開源中國' = any(tags)
結果如下:

4 更新
4.1 更新標簽的名稱
我們將 id = 1 的記錄的 tags 數(shù)組中, 社區(qū)改成開發(fā)者社區(qū)
注意:pg中數(shù)組類型,索引是從 1 開始,我們將 id = 1 的記錄,社區(qū)元素索引為3,修改語法為: update 表名 set 字段[index] = 'xx' where id=1
sql如下:
update blog set tags[3] = '開發(fā)者社區(qū)' where id=1
再次查詢,結果如下:

可以發(fā)現(xiàn),通過 tags[3] = '開發(fā)者社區(qū)' ,成功的把 社區(qū)修改成了 開發(fā)者社區(qū)
4.2 添加一個標簽
我們把 id=1 的記錄,標簽再增加一個 程序員標簽
可以使用PostgreSQL的 array_append 函數(shù)
使用方法如下:
sql寫法如下:
update blog set tags = array_append(tags, '程序員'::text) where id=1
再次查詢結果如下:

5 刪除
我們刪除標簽
把 id= 3 的記錄中的標簽,刪除開源
sql如下:
update blog set tags = array_remove(tags, '開源'::text) where id=3
執(zhí)行后,再次查詢,如下:

總結
以上就是關于 PostgreSQL 的數(shù)組類型的常見的用法,至于其它的用法,大家可以看一下官方文檔,再結合本例的SQL寫法
應該很容易就能掌握
以上的需求,其實實際應用中并不是適合用數(shù)組類型解決,數(shù)組適合的場景,操作,交互不多,不太重要,可以用
helloworld開發(fā)者社區(qū)在改版的過程中,數(shù)據(jù)庫雖然換成了 PostgreSQL ,但是博客的標簽這塊需求,并沒有用這種方式
此例只是方便說明用法,具體實際中怎么用,大家還需要結合自己的業(yè)務需求,靈活選擇
以上就是PostgreSQL 數(shù)組類型操作使用及特點詳解的詳細內容,更多關于PostgreSQL 數(shù)組類型的資料請關注腳本之家其它相關文章!
相關文章
PostgreSQL如何查看數(shù)據(jù)庫及表中數(shù)據(jù)占用空間大小詳解
這篇文章主要介紹了PostgreSQL中用于查看數(shù)據(jù)庫和表空間大小的函數(shù),并提供了每個函數(shù)的詳細說明和應用場景,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-02-02
UAT環(huán)境PostgreSQL ON CONFLICT DO UPDATE報錯問
這篇文章主要介紹了UAT環(huán)境PostgreSQL ON CONFLICT DO UPDATE報錯問題及解決過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2026-04-04
Postgresql數(shù)據(jù)庫中的json類型字段使用示例詳解
JSON的主要用于在服務器與web應用之間傳輸數(shù)據(jù),這篇文章主要介紹了Postgresql數(shù)據(jù)庫中的json類型字段使用,本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02
psql除法保留小數(shù),實現(xiàn)向上取整和向下取整操作
這篇文章主要介紹了psql除法保留小數(shù),實現(xiàn)向上取整和向下取整操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
PostgreSQL的外部數(shù)據(jù)封裝器fdw用法
這篇文章主要介紹了PostgreSQL的外部數(shù)據(jù)封裝器fdw用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
解決PostgreSQL服務啟動后占用100% CPU卡死的問題
前文書說到,今天耗費了九牛二虎之力,終于馴服了NTFS權限安裝好了PostgreSQL,卻不曾想,服務啟動后,新的狀況又出現(xiàn)了。2009-08-08

