本文演示一下一張基本表會有哪些信息保存在系統(tǒng)表里,演示版本:PostgreSQL 15.1。
知識前提,熟悉文檔 System Catalogs 一章,了解系統(tǒng)表結(jié)構(gòu)。
1、初始化一個數(shù)據(jù)庫
用戶自定義對象的Oid是從16384開始的,因此用一個干凈庫會比較省事,也更容易看到自己的新數(shù)據(jù)。
使用舊庫也可以,但如果某些默認值有過改動,而對PG又不夠了解,操作起來會麻煩些。本文目標是新手,可能對PG本身的使用還不夠熟練,所以使用新庫更合適一些。
2、建表
創(chuàng)建一個非常普通,沒有更多元素的簡單表:
CREATE TABLE t1 (
c1 int,
c2 float,
c3 timestamp,
c4 int[8]
) WITH (fillfactor=90);
特意選用4種常規(guī)的內(nèi)建類型,還有一個storage參數(shù)。
3、表基本信息
postgres=# SELECT oid,relname,reloptions
postgres-# FROM pg_class WHERE oid >=16384;
oid | relname | reloptions
-------+----------------------+-----------------
16388 | t1 | {fillfactor=90}
16406 | pg_toast_16388 |
16407 | pg_toast_16388_index |
(3 rows)
表的oid是系統(tǒng)幫我們選的,名字和參數(shù)分別出現(xiàn)在另外兩個字段中,而其它未指定或者不能指定的屬性都會有自己的默認值。
除了表本身,其它兩個是跟它有關的外儲表定義,網(wǎng)上有很多資料可以自行查看,暫不展開。
4、字段信息
需要用到在上一個步驟中查到的表oid
postgres=# SELECT attname,atttypid,attnum
postgres-# FROM pg_attribute WHERE attrelid = 16388;
attname | atttypid | attnum
----------+----------+--------
tableoid | 26 | -6
cmax | 29 | -5
xmax | 28 | -4
cmin | 29 | -3
xmin | 28 | -2
ctid | 27 | -1
c1 | 23 | 1
c2 | 25 | 2
c3 | 1114 | 3
c4 | 1007 | 4
(10 rows)
可以看到我們定義的四個字段,它們的順序 attnum 正好是我們的定義順序,對應的類型oid正好是我們指定類型在pg_tpye中的定義,其它是系統(tǒng)字段,暫時略過。
4、表類型
這似乎是PG很特殊的地方,表本身也有兩個對應的類型:
postgres=# SELECT oid,typname,typinput,typoutput,typrelid,typelem
postgres-# FROM pg_type WHERE oid >= 16384;
oid | typname | typinput | typoutput | typrelid | typelem
-------+---------+-----------+------------+----------+---------
16389 | _t1 | array_in | array_out | 0 | 16390
16390 | t1 | record_in | record_out | 16388 | 0
(2 rows)
一個是表本身的類型,另一個是這個類型的數(shù)組類型,暫時知道也就可以了。
5、類型
沒有展開講,上個例子可以看到類型的輸入輸出函數(shù),這些函數(shù)跟其他函數(shù)一樣定義在 pg_proc 中。
以上邊用到的 timestamp 類型為例:
postgres=# SELECT oid,typname,typinput,typoutput
postgres-# FROM pg_type WHERE oid = 1114;
oid | typname | typinput | typoutput
------+-----------+--------------+---------------
1114 | timestamp | timestamp_in | timestamp_out
(1 row)
它的輸入輸出函數(shù)定義:
postgres=# SELECT oid,proname,prorettype,proargtypes
postgres-# FROM pg_proc WHERE proname in ('timestamp_in','timestamp_out');
oid | proname | prorettype | proargtypes
------+---------------+------------+-------------
1312 | timestamp_in | 1114 | 2275 26 23
1313 | timestamp_out | 2275 | 1114
(2 rows)
輸入函數(shù)的返回類型,輸出函數(shù)的輸入類型,正好是我們的類型本身,關于類型以后再說。
可以看出,這四個表是相互依賴的:pg_class 本身需要在 pg_attribute 中保存自己的字段定義,還要在 pg_type 中保存類型定義,這些類型又用到 pg_proc 中的函數(shù)定義;pg_proc本身又需要在 pg_class和pg_attribute 中保存表和字段定義,又會需要 pg_type,類型定義甚至再需要 pg_proc?!?因此,這四個系統(tǒng)表是PG系統(tǒng)表的最基本部分,以后講初始化再講更多。
審核編輯:劉清
-
OID
+關注
關注
0文章
2瀏覽量
2316 -
postgresql
+關注
關注
0文章
21瀏覽量
230
發(fā)布評論請先 登錄
相關推薦
評論