0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

冬至子 来源:苦寒行 作者:苦寒行 2022-11-15 16:29 次阅读

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

审核编辑:刘清

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

    关注

    0

    文章

    2

    浏览量

    2299
  • postgresql
    +关注

    关注

    0

    文章

    20

    浏览量

    209
收藏 人收藏

    评论

    相关推荐

    音频信息是怎么保存和播放的?

    常用的音频格式有哪几种,我所了解的有mp3,WAV等,这些音频资料信息是怎么保存在电脑硬盘上的,我所说的保存是指怎么以二进制信息存储的? 在音频信息
    发表于 02-08 16:06

    Multisim数字万用表里电流接入电路没有示数是为什么

    这个数字万用表里的电流接入电路没有示数,但是感觉我的电路也没有问题,究竟是为什么?
    发表于 05-15 19:02

    请问esp who人脸识别的脸部信息如何保存在sd卡中?

    esp who人脸识别的脸部信息如何保存在sd卡中?
    发表于 06-28 08:09

    四位半电压设计,程序加到列表里边以后就会显示错误

    我们做的题目是四位半电压设计,程序单独运行没问题,但是加到列表里边以后就会显示错误。求大神帮助!
    发表于 08-06 10:25

    请问下如何把数据按不同的工段保存在一个中,但不是同一列

    各位大神 请问下如何把数据按不同的工段保存在同一表格的不同列,就是说比如一个产线,把每个工段的数据度保存在一个中,但不在同一列中,如图中那样
    发表于 09-12 19:48

    ZIGBEE 关联溢出的表现在哪里?

    溢出了;还有我们使用NLME_LeaveReq( &req );函数来清除无效的节点信息保存在NV里面的信息也会清除吗?
    发表于 03-22 13:53

    LabVIEW图像处理中保存图像时如何同时保存Overlay在图像上的信息

    ` 具体一点就是处理图像时通过Overlay在图像上添加了一些有用的信息保存图像时如何连同这些信息一起保存在图像上,例如中读出来的条码信息
    发表于 04-06 18:07

    请问内存大小与硬盘大小是保存在注册的哪个位置,键值是什么呢?

    如题,各位大视野,请问电脑的内存大小与硬盘大小是保存在注册的哪个位置,键值是什么呢?谢谢。
    发表于 04-26 10:08

    LABVIEW数据保存在EXCEL无法打开

    数据保存在文本文档里可以打开,保存在EXCEL却不行,显示发现不可读取的内容,怎么办啊。程序图是这样的。最后保存到文本文档是这样的。如果能保存在EXCEL了,怎么才能在这些数据上边添加
    发表于 11-17 14:23

    系统报错信息自动保存

    系统发生错误的时候怎样把错误提示消息写入到文档自动保存???
    发表于 04-14 10:24

    用户设置的参数动态信息保存方法有哪些呢

    前言:很多的嵌入式设备使用过程中,当系统掉电时,往往需要把一些用户设置的参数保存起来,或者是将掉电前的一些状态信息保存,或者是统计系统重启次
    发表于 02-10 07:44

    为什么会有INT引脚的存在

    目录11.1 INT的存在的意义11.2 I2C地址11.3 协议版本与读取报点信息11.4 I2C读取报点信息。11.5 LA抓取10点触控报点数据。11.1 INT的存在的意义 I
    发表于 03-02 06:10

    如何将详细信息保存在文本文件而不是EEPROM?

    我目前正在研究 DNSServer 提供的 CaptivePortalAdvanced 示例。这提供了一个名为“凭据”的草图,其中凭据保存在 EEPROM 中。但我想将详细信息保存在文本文件中,所以
    发表于 05-04 07:48

    录音电话的保存信息

    录音电话的保存信息              保存信息即录音电话所能录音
    发表于 12-31 14:41 1677次阅读

    嵌入式linux软件是怎样保存数据参数的

    大多数软件开发都会涉及到数据参数的保存与读取,小至运行的单片机的软件,大至操作系统级别的软件(如linux,windows,mac),均会有专门的子程序或者模块进行参数的保存和读取。不
    发表于 10-20 16:40 0次下载