电子说
本文演示一下一张基本表会有哪些信息保存在系统表里,演示版本:PostgreSQL 15.1。
知识前提,熟悉文档 System Catalogs 一章,了解系统表结构。
1、初始化一个数据库
用户自定义对象的Oid是从16384开始的,因此用一个干净库会比较省事,也更容易看到自己的新数据。
使用旧库也可以,但如果某些默认值有过改动,而对PG又不够了解,操作起来会麻烦些。本文目标是新手,可能对PG本身的使用还不够熟练,所以使用新库更合适一些。
2、建表
创建一个非常普通,没有更多元素的简单表:
CREATE TABLE t1 (
c1 int,
c2 float,
c3 timestamp,
c4 int[8]
) WITH (fillfactor=90);
特意选用4种常规的内建类型,还有一个storage参数。
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是系统帮我们选的,名字和参数分别出现在另外两个字段中,而其它未指定或者不能指定的属性都会有自己的默认值。
除了表本身,其它两个是跟它有关的外储表定义,网上有很多资料可以自行查看,暂不展开。
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中的定义,其它是系统字段,暂时略过。
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)
一个是表本身的类型,另一个是这个类型的数组类型,暂时知道也就可以了。
5、类型
没有展开讲,上个例子可以看到类型的输入输出函数,这些函数跟其他函数一样定义在 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)
它的输入输出函数定义:
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)
输入函数的返回类型,输出函数的输入类型,正好是我们的类型本身,关于类型以后再说。
可以看出,这四个表是相互依赖的:pg_class 本身需要在 pg_attribute 中保存自己的字段定义,还要在 pg_type 中保存类型定义,这些类型又用到 pg_proc 中的函数定义;pg_proc本身又需要在 pg_class和pg_attribute 中保存表和字段定义,又会需要 pg_type,类型定义甚至再需要 pg_proc。…… 因此,这四个系统表是PG系统表的最基本部分,以后讲初始化再讲更多。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !