1. 程式人生 > >PostgreSQL 資料型別介紹(四)

PostgreSQL 資料型別介紹(四)

  • uuid型別

    UUIDs could be generated by client applications or other libraries invoked through a server-side function.
    specifically a group of 8 digits followed by three groups of 4 digits followed by a group of 12 digits, for a total of 32 digits representing the 128 bits


*關於如何安裝uuid外掛,本文不作描述,請自行安裝。
這裡介紹的是 pgcrypto 模組的 gen_random_uuid() 函式。使用該函式之前,確保pg安裝了pgcrypto擴充套件。* 以下示例參考部落格:https://segmentfault.com/a/1190000008793136

示例: 用 uuid 當作 primary key (主鍵)

postgres=# CREATE SCHEMA IF NOT EXISTS developerworks
; CREATE SCHEMA postgres=# CREATE TABLE developerworks.contacts ( postgres(# id UUID PRIMARY KEY DEFAULT gen_random_uuid(), postgres(# name TEXT, postgres(# email TEXT postgres(# ); CREATE TABLE postgres=# INSERT INTO developerworks.contacts (name,email) VALUES postgres-# ('Dr Nic Williams','drnic'
), postgres-# ('Brian Mattal','brian'), postgres-# ('Wayne E. Seguin','wayneeseguin'), postgres-# ('Long Nguyen','long'), postgres-# ('Bill Chapman','bill'), postgres-# ('Chris Weibel','chris'), postgres-# ('Jeremey Budnack','jrbudnack'), postgres-# ('Ruben Koster','rkoster'), postgres-# ('Jamie Van Dyke'
,'jamie'), postgres-# ('Quintessence Anx','qanx'), postgres-# ('McGowan','mcg'), postgres-# ('高,秀嬌 (XJ)','xj'), postgres-# ('Geoff Franks','geoff'), postgres-# ('Van Nguyen','vnguyen'), postgres-# ('John Longanecker','jlonganecker') postgres-# ; INSERT 0 15 postgres=# SELECT * FROM developerworks.contacts; id | name | email --------------------------------------+------------------+-------------- 312b5f4a-f362-4fc4-b432-d508266014a1 | Dr Nic Williams | drnic 4e534213-861b-47ab-b56a-ac8e5d4aa31c | Brian Mattal | brian b1936e1c-31a1-4855-919b-54959eecde1a | Wayne E. Seguin | wayneeseguin 01ede71d-2490-4b09-ba91-6aaeee94b7e9 | Long Nguyen | long 5d83c888-1598-497b-9082-764d74be6edc | Bill Chapman | bill d962ed8c-6a60-4864-a96e-c905da0e2f80 | Chris Weibel | chris 9b5766e6-663c-4280-b901-9169cbc601f6 | Jeremey Budnack | jrbudnack 9188ba0e-e313-4eb9-ae3b-506389db8760 | Ruben Koster | rkoster f928c293-392c-4233-8b34-2b41d18b6e36 | Jamie Van Dyke | jamie bbb653c7-ba44-4edd-975e-8b91d102288b | Quintessence Anx | qanx 15eff13b-dc38-47bb-843b-aa762439c6d9 | McGowan | mcg 71dc6344-cc48-4600-a094-4639b861b4ed | 高,秀嬌 (XJ) | xj ca9ddf25-cff8-4c2a-af1f-ea8841c4b540 | Geoff Franks | geoff e2d1f1f4-4e3a-41a9-b7aa-2111af985614 | Van Nguyen | vnguyen 44a26489-c78f-49a5-aeae-7453073dc2f6 | John Longanecker | jlonganecker (15 rows)

建立uuid的方式有很多,這個擴充套件只是一種方式,可以看看其他的方式。

  • 陣列型別
1.不限制長度

目前PostgreSQL未對長度強限定, 如int[]和int[10]都不會限定元素個數.
array_length(ARRAY[[1,2,3,4,5],[6,7,8,9,10]], 1)

2.不限維度

目前PostgreSQL未對維度強限定,如int[]和int[][], 效果是一樣的, 都可以儲存任意維度的陣列

3.矩陣強制

多維陣列中, 同一個維度的元素個數必須相同
正確 array[[1,2,3,4],[5,6,7,8]]
不正確 array[[1,2,3,4],[5,6,7]]

4.元素強制

元素型別必須一致
正確
array[1,2,3]
不正確
array[1,2,’abc’]

  • 陣列型別如何擴充套件:
一維陣列的擴充套件
postgres=# select array_append(ARRAY['digoal','francs'],'david');
     array_append      
-----------------------
 {digoal,francs,david}
(1 row)

postgres=# select array_append(ARRAY['digoal','francs'],'david');
     array_append      
-----------------------
 {digoal,francs,david}
(1 row)

postgres=# select array_prepend('david',ARRAY['digoal','francs']);
     array_prepend     
-----------------------
 {david,digoal,francs}
(1 row)
二維陣列的擴充套件
postgres=# array_cat(ARRAY[['digoal','zhou'],['francs','tan']], ARRAY['david','guo']);
postgres=# select array_cat(ARRAY[['digoal','zhou'],['francs','tan']], ARRAY['david','guo']) ;
                array_cat                 
------------------------------------------
 {{digoal,zhou},{francs,tan},{david,guo}}
(1 row)

關於 Postgresql array型別的相關函式
這裡,我剛開始不是很理解,這幾個函式到底如何工作的,經過兩個小時的探討,我決定寫一篇獨立部落格來解釋明白這個問題。
請關注我相關部落格: Postgres array 陣列型別詳細使用

  • 自定義資料型別
建立表時預設建立一個同名composite type, 因此表名和自定義類名不能重複  如:
postgres=# create type test as (info text,id int,crt_time timestamp(0));
ERROR:  type "test" already exists
因為我之前已經建立了一個test表了,相應地建立了test型別,所以這裡再次建立test型別的話,就會報錯。
按照如上邏輯,建立表就建立型別了,那麼也就意味著我們可以使用該型別了:
postgres=# create table diy(name test );//成功使用該型別。
CREATE TABLE
接下來:建立一個自定義型別的成功示例:
postgres=# CREATE TYPE inventory_item AS( name text,supplier_id integer,price numeric);
CREATE TYPE
使用該自定義型別
postgres=# CREATE TABLE on_hand (item inventory_item,count integer);
CREATE TABLE
對含有自定義型別的表進行  增刪改查操作:
插入記錄:ROW 在這裡指定其是一個符合型別。
個人感覺特別像java裡的傳入引數是個自定義物件的函式。
postgres=# INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000);
INSERT 0 1
查詢記錄:
postgres=# SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price <10;
    name    
-----------------------+-------
 fuzzy dice
(1 row)
更新操作  更新整個item:
postgres=# UPDATE on_hand SET item = ROW('fuzzy dice',10,100) WHERE count=1000;
UPDATE 1
更新操作 更新item型別裡的某個子型別
postgres=# UPDATE on_hand SET item.price = (on_hand.item).price + 100 WHERE(on_hand.item).name='fuzzy dice';
UPDATE 1
插入操作 (item.name, item.supplier_id) 和 VALUES('test', 2.2); 對應好就OK了。
postgres=# INSERT INTO on_hand (item.name, item.supplier_id) VALUES('test', 2.2);
INSERT 0 1
postgres=# select * from on_hand;
         item          | count 
-----------------------+-------
 ("fuzzy dice",10,200) |  1000
 (test,2,)             |      
(2 rows)