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的方式有很多,这个扩展只是一种方式,可以看看其他的方式。

  • xml相关的格式


    xml

    关于如何安装,这部分我会写一个独立博客的。

  • 数组类型
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']

关于使用:
请参考blog:http://www.cnblogs.com/alianbog/p/5665411.html

  • 数组类型如何扩展:
一维数组的扩展
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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容