基本表会有哪些信息保存在系统表里

电子说

1.2w人已加入

描述

本文演示一下一张基本表会有哪些信息保存在系统表里,演示版本: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系统表的最基本部分,以后讲初始化再讲更多。

审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分