# 建立一個複合類型person # 命令格式:create type xxx AS (); testdb=# create type person AS ( testdb(# name text, testdb(# age int4, testdb(# sex boolean testdb(# ); CREATE TYPE testdb=# \d person; 合成類型 "public.person" 欄位 | 類型 | Collation | Nullable | Default ------+---------+-----------+----------+--------- name | text | | | age | integer | | | sex | boolean | | | testdb=# \dt person; 沒有找到任何名稱爲 "person" 的關聯。 testdb=# \d person; 合成類型 "public.person" 欄位 | 類型 | Collation | Nullable | Default ------+---------+-----------+----------+--------- name | text | | | age | integer | | | sex | boolean | | | # 建立一個帶複合類型的表author testdb=# create table author ( testdb(# id int4, testdb(# people person, testdb(# book text testdb(# ); CREATE TABLE testdb=# \d author; 數據表 "public.author" 欄位 | 類型 | Collation | Nullable | Default --------+---------+-----------+----------+--------- id | integer | | | people | person | | | book | text | | | # 插入數據 testdb=# insert into author values(1, ' ("qkl", 29, TRUE)', '張三的自傳'); INSERT 0 1 # 缺省不填寫就是NULL,逗號間不要有空格 testdb=# insert into author values(2, '("zgq", , TRUE)', '張三的自傳2'); ERROR: invalid input syntax for integer: " " 第1行insert into author values(2, '("zgq", , TRUE)', '張三的自傳2... ^ testdb=# insert into author values(2, '("zgq",,TRUE)', '張三的自傳2'); INSERT 0 1 testdb=# insert into author values(2, '("zgq",, TRUE)', '張三的自傳2'); INSERT 0 1 testdb=# insert into author values(3, '("",, TRUE)', '張三的自傳3'); INSERT 0 1 # ROW行插入,注意ROW後面的字符請用單引號,不能帶雙引號 testdb=# insert into author values(4, ROW("",, TRUE), '張三的自傳5'); ERROR: zero-length delimited identifier at or near """" 第1行insert into author values(4, ROW("",, TRUE), '張三的自傳5'); ^ testdb=# insert into author values(4, ROW('PCB',, TRUE), '張三的自傳5'); ERROR: syntax error at or near "," 第1行insert into author values(4, ROW('PCB',, TRUE), '張三的自傳5... ^ # 省略ROW testdb=# insert into author values(4, ('hgr',30, TRUE), '張三的自傳6'); INSERT 0 1 testdb=# select (people).name from author; name ------ qkl zgq zgq hgr (5 行記錄) # 更新複合類型數據,複合類型名不帶括號 testdb=# update author set people.name='qkl2' where id=1; UPDATE 1 testdb=# select people from author; people ------------- (zgq,,t) (zgq,,t) ("",,t) (hgr,30,t) (qkl2,29,t) (5 行記錄) testdb=# update author set people.age = people.age +1 where id=1; ERROR: missing FROM-clause entry for table "people" 第1行update author set people.age = people.age +1 where id=1; ^ # 若是更新的字段右邊也是複合類型必須攜帶括號 testdb=# update author set people.age = (people).age +1 where id=1; UPDATE 1 testdb=# select people from author; people ------------- (zgq,,t) (zgq,,t) ("",,t) (hgr,30,t) (qkl2,30,t) (5 行記錄) # 單獨插入複合類型的數據 testdb=# insert into author (id, people.name, people.age) values(7, 'ldh', 33); INSERT 0 1 testdb=# select * from author; id | people | book ----+-------------+------------- 2 | (zgq,,t) | 張三的自傳2 2 | (zgq,,t) | 張三的自傳2 3 | ("",,t) | 張三的自傳3 4 | (hgr,30,t) | 張三的自傳6 1 | (qkl2,30,t) | 張三的自傳 7 | (ldh,33,) | (6 行記錄)
xm丨類型能夠用於存儲XML數據。使用字符串類型(如text)也能夠存儲XML數據,但text類型不能保證其中存儲的是合法XML數據,一般須要由應用程序來負責保證輸人數據的正確性,這將增長應用程序開發的難度。而使用xml類型就不存在此問題。數據庫會對輸人的數據進行檢查,讓一些不符合XML標準的數據不能存放到數據庫中,同時還提供了函數對其類型進行安全性檢査。
注意,要使用xml數據類型,在編譯PostgreSQL源碼時必須使用如下參數:
configure --with-libxmlexpress
xml存儲的XML數據杳兩種:json
documents
。content
片斷。content
片斷能夠有多個級元素或character
節點.但documents
只能有一個頂級元素。可使用xmlvalue is DOCUMENT
來判斷一個特定的XML值是一個documents
還足content
片斷。
PostgreSQL的xmlopiions參數用來指定輸人的數據是documents
仍是content
片斷,默認狀況下此值爲content
片斷。因此輸人的xml能夠有多個頂級元素,但若是把此參數改爲document
,將不能輸人有多個頂級元素的內容。segmentfault
PostgreSQL數據庫在客戶端與服務器之間傳遞數據時,會自動進行字符集的轉換。若是客戶端的字符集與服務端不同,PostgreSQL會自動進行字符集轉換。但也正是由於有這個特性,在傳遞XML數據時須要格外注意。咱們知道,對於XML文件來講,能夠經過相似「encoding="XXX"」的方式指定本身文件的字符集,但當這些數據在PostgreSQL之間傳遞時, PostgreSQL會把其原始內容的宇符集變成數據庫服務端的字符集,而這就會致使問題,由於這意味着XML數據中的字符集編碼聲明在客戶端和服務器之間傳遞時,可能變得無效。爲了應對該問題,提交輸人到xml類型的字符串中的編碼聲明將會被忽略掉.同時內容的字符集會被認爲是當前數據庫服務器的字符集。數組
正確處理XML字符集的方式是,先將XML數據的字符串在當前客戶端中編碼成當前客戶端的字符集,而後再發送到服務端,這樣就會被轉換成服務端的字符集存儲。當査詢xml 類型的值時,此數據又會被轉換成客戶端的字符集,因此客戶端收到的XML數據的字符集就是客戶端的字符集。
因此一般來講,若是XML數據的字符集編碼、客戶端字符集編碼,以及服務器字符集編碼徹底同樣,那麼用PostgreSQL處理XML數據將會大大減小字符集問題,而且處理的效率也會很高。一般XML數據都是用UTF-8編碼格式處理的,所以把PostgreSQL數據庫服務器端編碼也設置成UTF-8將是一種較好的選擇。安全
postgres=# select xml'<code>hello postgres</code>'; xml ----------------------------- <code>hello postgres</code> (1 行記錄) postgres=# show xmloption; xmloption ----------- content (1 行記錄) postgres=# set xmloption TO document; SET postgres=# show xmloption; xmloption ----------- document (1 行記錄) # document類型,插入多頂級元素,出錯 postgres=# select xml'<code>hello postgres</code><other>hello world</other>'; ERROR: invalid XML document 第1行select xml'<code>hello postgres</code><other>hello world</ot... ^ 描述: line 1: Extra content at the end of the document <code>hello postgres</code><other>hello world</other> ^ postgres=# set xmloption TO content; SET postgres=# select xml'<code>hello postgres</code><other>hello world</other>'; xml ------------------------------------------------------- <code>hello postgres</code><other>hello world</other> (1 行記錄) # xmlparse函數 postgres=# select xmlparse(document'<?xml version="1.0"?><person><name>qkl</name></person>'); xmlparse ----------------------------------- <person><name>qkl</name></person> (1 行記錄) postgres=# select xmlparse(content'<?xml version="1.0"?><person><name>qkl</name></person>'); xmlparse ----------------------------------- <person><name>qkl</name></person> (1 行記錄)
JSON數據類型是從P〇StgreSQL9.3開始提供的一種類型,9.3版中只有一種類型:JSON
在PosIgreSQL 9.4中乂提供了一種更高效的類型JSONB這兩種類型在使用上幾乎徹底一致,主要的區別是,JSON類型是把輸人的數據原封不動地存放到數據庫中(固然在存放前會作JSON的語法檢查),使用的時候須要®:新解析數據,而JSONB類型是在存放時就把JSON解折成二進制格式了,使用的時候就不須要再次解析,因此JSONB在使用時性能會更高。另外,JSONB支持在其上逑索引,iftHSON則不能,這是JSONB類型的很大一個優勢。
由於JSON類型是把輸人的整個字符串原封不改動地保存到數據庫中的,所以JSON串中key之間多餘的空格也會保留。並且,若是JSON串中有重複的key,這些重複的key也會保留(默認處理時以最後一個爲準),同時也會保留輸人時JSON串中各個key的順序。而JSONB類塑則偏偏相反,+會保留多餘的空格,不會保留key的順序,也不會保留重複的key。
在PostgreSQL中只容許毎個數據庫用一種服務器編碼,若是數據庫的編碼不是UTF-8,PostgreSQL中的JSON類塑是沒法嚴格符合JSON規範中對字符集的要求的。若是輸人中包含不能在服務器編碼中表示的字符數據,將沒法導人到數據庫中。可是,能在服務器編碼中表示的
非UTF-8字符則是被容許的。可使用uXXXX形式的轉義,從而忽視數據庫的字符集編碼。
當把一個JSON字符串轉換成JSONB類塑吋,JSON字符串內的數據類型實際上被轉換成rPostgreSQL數據庫中的類塑,二者的映射關係見表5-30。耑要注意的是,若是是在JS0NB中,在PostgrcSQL 不能輸人超出numeric數據類型範鬧的值。服務器
基礎操做架構
testdb=# select '9'::json, '"osdba"'::json, 'true'::json, 'null'::json; json | json | json | json ------+---------+------+------ 9 | "osdba" | true | null (1 行記錄) testdb=# select '[9, true, "qkl", null]'::json, '[9, true, "qkl", null]'::jsonb; json | jsonb ------------------------+------------------------ [9, true, "qkl", null] | [9, true, "qkl", null] (1 行記錄) testdb=# select json'{"name":"qkl", "age":18, "sex":true, "money":888.88}'; json ------------------------------------------------------ {"name":"qkl", "age":18, "sex":true, "money":888.88} (1 行記錄) # json 存取的是浮點型,存在精度問題 testdb=# select json'{"p":1.684544545454e-27}'; json -------------------------- {"p":1.684544545454e-27} (1 行記錄) # jsonb存取的是numeric testdb=# select jsonb'{"p":1.684544545454e-27}'; jsonb -------------------------------------------------- {"p": 0.000000000000000000000000001684544545454} (1 行記錄)
更多和操做符app
testdb=# select json'[1,2,3]'->0; ?column? ---------- 1 (1 行記錄) testdb=# select json'[1,2,3]'->3; ?column? ---------- (1 行記錄) testdb=# select json'[1,2,3]'->2; ?column? ---------- 3 (1 行記錄) testdb=# select json'[1,2,3]'->>2; ?column? ---------- 3 (1 行記錄) testdb=# select json'[1,2,3]'->>'2'; ?column? ---------- (1 行記錄) testdb=# select json'{"a":1,"b":22}'->>'a'; ?column? ---------- 1 (1 行記錄) testdb=# select json'{"a":{"a1":{"a11":111}},"b":22}'#>'{a,a1}' testdb-# ; ?column? ------------- {"a11":111} (1 行記錄) testdb=# select json'{"a":{"a1":{"a11":111}},"b":22}'#>'{a,a1,a11}' testdb-# ; ?column? ---------- 111 (1 行記錄) testdb=# select json'{"a":{"a1":{"a11":111}},"b":22}'#>>'{a,a1,a11}'; ?column? ---------- 111 (1 行記錄) testdb=# select json'{"a":{"a1":{"a11":111}},"b":22}'#>>'{a,a1}'; ?column? ------------- {"a11":111} (1 行記錄)
testdb=# select '(0,6)'::int4range; int4range ----------- [1,6) (1 行記錄) testdb=# select '[0,6)'::int4range; int4range ----------- [0,6) (1 行記錄) testdb=# select '[0,6]'::int4range; int4range ----------- [0,7) (1 行記錄) testdb=# select 'empty'::int4range; int4range ----------- empty (1 行記錄) # 上面咱們看出,int4range總數會轉換成`[)`格式 testdb=# select '[0,6]'::numrange; numrange ---------- [0,6] (1 行記錄) testdb=# select '[0,6)'::numrange; numrange ---------- [0,6) (1 行記錄) testdb=# select '(0,6)'::numrange; numrange ---------- (0,6) (1 行記錄) testdb=# select '(0,)'::numrange; numrange ---------- (0,) (1 行記錄) testdb=# select '[1,)'::numrange; numrange ---------- [1,) (1 行記錄)
PostgreSQL支持表的字段使用定長或可變長度的一維或多維數組,數組的類型能夠是任何數據庫內建的類型、用戶自定義的類型、枚舉類型,以及組合類型。但目前還不支持domain類型。dom
create table test6 (id int, col1 int[], col2 int[10], col3 text[][]); create table test7 (id int, col1 int[10], col2 int[], col3 text[]);
在第一個語句中第二列的聲明col2 int[10]
與第二個語句中第二列的聲明col2 int[]
其意思相同;而在第一個語句中第三列的聲明col3 text[][]
與第二個語句中第三列的聲明col3 text[]
的意思也是相同的
咱們來查看下錶結構
testdb=# create table test6 (id int, col1 int[], col2 int[10], col3 text[][]); CREATE TABLE testdb=# create table test7 (id int, col1 int[10], col2 int[], col3 text[]); CREATE TABLE testdb=# \d 關聯列表 架構模式 | 名稱 | 類型 | 擁有者 ----------+--------------+--------+---------- public | author | 數據表 | postgres public | test1 | 數據表 | postgres public | test2 | 數據表 | postgres public | test2_id_seq | 序列數 | postgres public | test3 | 數據表 | postgres public | test3_id_seq | 序列數 | postgres public | test6 | 數據表 | postgres public | test7 | 數據表 | postgres (8 行記錄) testdb=# \d test6; 數據表 "public.test6" 欄位 | 類型 | Collation | Nullable | Default ------+-----------+-----------+----------+--------- id | integer | | | col1 | integer[] | | | col2 | integer[] | | | col3 | text[] | | | testdb=# \d test7; 數據表 "public.test7" 欄位 | 類型 | Collation | Nullable | Default ------+-----------+-----------+----------+--------- id | integer | | | col1 | integer[] | | | col2 | integer[] | | | col3 | text[] | | |
testdb=# create table test66(id int, col1 int[]); CREATE TABLE testdb=# insert into test66 values(1, '{1,2,3}'); INSERT 0 1 testdb=# insert into test66 values(2, '{4,5,6}'); INSERT 0 1 testdb=# select * from test66; id | col1 ----+--------- 1 | {1,2,3} 2 | {4,5,6} (2 行記錄) testdb=# create table test77(id int, col1 text[]); CREATE TABLE testdb=# insert into test77 values(1, '{how, howe, howl}'); INSERT 0 1 testdb=# select * from test77; id | col1 ----+----------------- 1 | {how,howe,howl} (1 行記錄) testdb=# insert into test77 values(1, '{"how", "howe", "howl"}'); INSERT 0 1 testdb=# select * from test77; id | col1 ----+----------------- 1 | {how,howe,howl} 1 | {how,howe,howl} (2 行記錄) # 注意上面不一樣的類型,可能分隔符會不同,下面可查詢不一樣類型的分隔符 testdb=# select typname,typdelim from pg_type where typname in ('int4', 'int8', 'bool', 'char', 'box'); typname | typdelim ---------+---------- bool | , char | , int8 | , int4 | , box | ; (5 行記錄) testdb=# create table test778(id int ,col1 box[]); CREATE TABLE testdb=# insert into test778 values(1, '{((1,1), (2,2)); ((3,3),(4,4))}'); INSERT 0 1 testdb=# select * from test778; id | col1 ----+--------------------------- 1 | {(2,2),(1,1);(4,4),(3,3)} (1 行記錄) # 上面輸人的字符串內容是沒有空格的,在有空格時,乂該如何輸人呢?見下面的例子: testdb=# insert into test77 values(3,'{how many,how mach,how old}'); INSERT 0 1 能夠看到有空格,也能夠直接輸人。 那麼字符串中有逗號時怎麼辦呢?這時可使用雙引號,以下: testdb=# insert into test77 values(4,'{"who, what", "CO.,LTD."}'); INSERT 0 1 若是字符串中有單引號怎麼辦呢?這時可使用兩個鏈接的單引號表示一個單引號: testdb=# insert into test77 values(3,'{"who''s bread", "It''s ok"}'); INSERT 0 1 若是輸人的字符串中有括號"{"和"}"怎麼辦呢?只需把它們放到雙引號中便可: testdb=# insert into test77 values (5, '{"{os, dba}", "{dba, os}"}'); INSERT 0 1 若是輸人的字符串中有雙引號怎麼辦呢?這時須要在雙引號前加反斜扛,以下所示: testdb=# insert into test77 values(6,'{os\"dba}'); testdb=# select * from test77; id | col1 ----+----------------------------------- 1 | {how,howe,howl} 1 | {how,howe,howl} 3 | {"how many","how mach","how old"} 4 | {"who, what","CO.,LTD."} 3 | {"who's bread","It's ok"} 5 | {"{os, dba}","{dba, os}"} 6 | {"os\"dba"} (7 行記錄) # ARRAY關鍵詞的使用,需帶單引號 testdb=# insert into test77 values(9, array['os', 'dba']); INSERT 0 1 testdb=# insert into test77 values(9, array['os"win', 'dba']); INSERT 0 1 testdb=# insert into test77 values(9, array['os''win', 'dba']); INSERT 0 1 testdb=# select * from test77; id | col1 ----+----------------------------------- 1 | {how,howe,howl} 1 | {how,howe,howl} 3 | {"how many","how mach","how old"} 4 | {"who, what","CO.,LTD."} 3 | {"who's bread","It's ok"} 5 | {"{os, dba}","{dba, os}"} 6 | {"os\"dba"} 9 | {os,dba} 9 | {"os\"win",dba} 9 | {os'win,dba} (10 行記錄)
# 多維數組 testdb=# create table test779 (id int , col1 test[][]); ERROR: type "test[]" does not exist 第1行create table test779 (id int , col1 test[][]); testdb=# create table test779 (id int , col1 text[][]); CREATE TABLE testdb=# \d test779; 數據表 "public.test779" 欄位 | 類型 | Collation | Nullable | Default ------+---------+-----------+----------+--------- id | integer | | | col1 | text[] | | | testdb=# insert into test779 values(1, array[['aa'], ['cc']]); INSERT 0 1 testdb=# insert into test779 values(1, array[['aa','bb'], ['cc','dd']]); INSERT 0 1 testdb=# select * from test779; id | col1 ----+------------------- 1 | {{aa},{cc}} 1 | {{aa,bb},{cc,dd}} (2 行記錄) testdb=# insert into test779 values(1, array[['aa','bb'], ['cc','dd','dd']]); ERROR: multidimensional arrays must have array expressions with matching dimensions testdb=# insert into test779 values(3, '{{aa, bb}, {cc, dd}}'); INSERT 0 1 testdb=# select * from test779; id | col1 ----+------------------- 1 | {{aa},{cc}} 1 | {{aa,bb},{cc,dd}} 3 | {{aa,bb},{cc,dd}} (3 行記錄) # 默認狀況下數組的下標是從1開始的,postgres的數組是能夠指定開始下標的 testdb=# create table test7799 (id int[]); CREATE TABLE testdb=# insert into test7799 values('[2:4]={1,2,3}'); INSERT 0 1 testdb=# select id[2], id[3], id[4] from test7799; id | id | id ----+----+---- 1 | 2 | 3 (1 行記錄) testdb=# select id from test7799; id --------------- [2:4]={1,2,3} (1 行記錄) testdb=# insert into test7799 values('{11,22,33}'); INSERT 0 1 testdb=# select id[2], id[3], id[4] from test7799; id | id | id ----+----+---- 1 | 2 | 3 22 | 33 | (2 行記錄) testdb=# select id[1], id[2], id[3] from test7799; id | id | id ----+----+---- | 1 | 2 11 | 22 | 33 (2 行記錄) # 從上面的例子能夠看出,指定數組上下標的格式爲: `[下標:上標] = [元素值1, 元素值2, 元素值3..]`
testdb=# create table test666 (id int, col1 int[][]); CREATE TABLE testdb=# \d test666; 數據表 "public.test666" 欄位 | 類型 | Collation | Nullable | Default ------+-----------+-----------+----------+--------- id | integer | | | col1 | integer[] | | | testdb=# insert into test666 values(1, '{{1,2,3}, {4,5,6}, {7,8,9}}'); INSERT 0 1 testdb=# select * from test666; id | col1 ----+--------------------------- 1 | {{1,2,3},{4,5,6},{7,8,9}} (1 行記錄) # 多維數組讀取 testdb=# select col1[1][1], col1[1][2], col1[2][1], col1[2][2] from test666; col1 | col1 | col1 | col1 ------+------+------+------ 1 | 2 | 4 | 5 (1 行記錄) # 沒法直接獲取外層數組 testdb=# select id, col1[1] from test666; id | col1 ----+------ 1 | (1 行記錄) # 數組切換可獲取 testdb=# select id, col1[1:1] from test666; id | col1 ----+----------- 1 | {{1,2,3}} (1 行記錄) testdb=# select id, col1[1:2] from test666; id | col1 ----+------------------- 1 | {{1,2,3},{4,5,6}} (1 行記錄) # 注意這裏的外層實際上是col1[3][1:2] == col1[1:3][1:2] testdb=# select id, col1[3][1:2] from test666; id | col1 ----+--------------------- 1 | {{1,2},{4,5},{7,8}} (1 行記錄) testdb=# select id, col1[1:3][1:2] from test666; id | col1 ----+--------------------- 1 | {{1,2},{4,5},{7,8}} (1 行記錄) # 注意這裏的外層實際上是col1[1:2][2] == col1[1:2][1:2] testdb=# select id, col1[1:2][2] from test666; id | col1 ----+--------------- 1 | {{1,2},{4,5}} (1 行記錄) testdb=# select id, col1[1:2][1:2] from test666; id | col1 ----+--------------- 1 | {{1,2},{4,5}} (1 行記錄) # 修改 # 能夠修改整個字段數組值,或修改某一維度的單元素的值 # 不過沒法直接修改某一維數組的值 testdb=# select * from test666; id | col1 ----+--------------------------- 1 | {{1,2,3},{4,5,6},{7,8,9}} (1 行記錄) testdb=# update test666 set col1[2][1] = 1000 where id=1; UPDATE 1 testdb=# select * from test666; id | col1 ----+------------------------------ 1 | {{1,2,3},{1000,5,6},{7,8,9}} (1 行記錄) testdb=# update test666 set col1[2] = '{1,2,3}' where id=1; ERROR: invalid input syntax for integer: "{1,2,3}" 第1行update test666 set col1[2] = '{1,2,3}' where id=1;
僞類型(Pseudo-Types)是PostgreSQL中不能做爲字段的數據類型,可是它能夠用於聲明
一個函數的參數或者結果類型。所包含的類型有:
□ any:用於指示函數的輸人蔘數能夠是任意數據類型的。
□ anyelement:表示一個函數接受任何數據類型。
□ anyarray:表示一個函數接受任何數組類型。
□ anynonarray:表示一個函數接受任何非數組類塑。
□ anyenum:表示一個函數接受任何枚舉類型_。
□ anyrange:表示一個函數接受任何範類型。
□ cstring:表示一個函數接受或返回一個空字符(0)結尾的C語言字符串。
□ internal:表示一個函數接受或者返冋一種服務器內部的數據類型。
□ language_handler:聲明一個函數返回類型是pi語言的一個handler閒數。
□ fdw_handler:聲明一個函數的返冋類型楚foreign-data wrapper的handler函數。
□ record:標識一個函數返回一個未詳細定義各列的row類型。
□ trigger: 一個觸發器函數要聲明爲返回trigger類型。
□ void:表示一個函數沒有返問值。
□ opaque:已通過時的類型,舊的PostgreSQL版本中用於上面這些用途。
用C編寫的函數(不論是內H的仍是動態裝載的)均可以盧明爲接受或返冋上面任意一種僞數據類型。在把僞類型用做函數參數類型時,PostgreSQL數據庫自己對類型檢査就少了不少,保證類沏正確的任務就交給了寫函數的幵發人員。
用過程語言編寫的函數不必定都能使用上面列出的所有僞類型,具體能使用哪些須要喪看相關的過程語言文襠,或者查C•過程語言的實現。一般,過程語言都不支持使用「any」類型,但基本都能支持使用void和record做爲結果類®,能支持多態閒數的過程語言還支持使
用「311)^〇^」、「311>^丨6咖111」、「3!1)^1111171」和‘‘311>010113〇'3>^’類型〇僞 類 型 「intemar用於聲明那種只能在數據庫系統內部調用的函數,它們不能直接在SQL査詢裏調用。若是函數至少有一個「internal」類型的參數,那麼就不能從SQL裏調用。
爲了保留這個限制的類塑安全,必定要遵循這樣的編碼規則:對於沒有任何一個"internal」參數的函數,不要把返回類型建立爲「internal」。
UUID( Universally Unique Identifiers)用於存儲一個 UUID; UUID 定義在RFC 4122
和 ISO/IEC 9834-8:2005
中。它是一個128bit的數字
PostgreSQL核心源代碼中沒提供產生UUID的函數,contrib下的uuid-ossp模塊提供UUID的函數
pg_lsn類切是PostgrcSQL9.4版本以後提供的表示LSN ( Log Sequence Number)的一種數據類擬。LSN表示WALfi志的位酋。在一些記錄WALti志信息的系統表中某些字段的類型就是pg_lsn類型