0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

基本表會有哪些信息保存在系統(tǒng)表里

冬至子 ? 來源:苦寒行 ? 作者:苦寒行 ? 2022-11-15 16:29 ? 次閱讀

本文演示一下一張基本表會有哪些信息保存在系統(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)表的最基本部分,以后講初始化再講更多。

審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • OID
    OID
    +關注

    關注

    0

    文章

    2

    瀏覽量

    2316
  • postgresql
    +關注

    關注

    0

    文章

    21

    瀏覽量

    230
收藏 人收藏

    評論

    相關推薦

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

    常用的音頻格式有哪幾種,我所了解的有mp3,WAV等,這些音頻資料信息是怎么保存在電腦硬盤上的,我所說的保存是指怎么以二進制信息存儲的? 在音頻信息
    發(fā)表于 02-08 16:06

    Multisim數(shù)字萬用表里電流接入電路沒有示數(shù)是為什么

    這個數(shù)字萬用表里的電流接入電路沒有示數(shù),但是感覺我的電路也沒有問題,究竟是為什么?
    發(fā)表于 05-15 19:02

    請問esp who人臉識別的臉部信息如何保存在sd卡中?

    esp who人臉識別的臉部信息如何保存在sd卡中?
    發(fā)表于 06-28 08:09

    四位半電壓設計,程序加到列表里邊以后就會顯示錯誤

    我們做的題目是四位半電壓設計,程序單獨運行沒問題,但是加到列表里邊以后就會顯示錯誤。求大神幫助!
    發(fā)表于 08-06 10:25

    請問下如何把數(shù)據(jù)按不同的工段保存在一個中,但不是同一列

    各位大神 請問下如何把數(shù)據(jù)按不同的工段保存在同一表格的不同列,就是說比如一個產(chǎn)線,把每個工段的數(shù)據(jù)度保存在一個中,但不在同一列中,如圖中那樣
    發(fā)表于 09-12 19:48

    ZIGBEE 關聯(lián)溢出的表現(xiàn)在哪里?

    溢出了;還有我們使用NLME_LeaveReq( &req );函數(shù)來清除無效的節(jié)點信息,保存在NV里面的信息也會清除嗎?
    發(fā)表于 03-22 13:53

    LabVIEW圖像處理中保存圖像時如何同時保存Overlay在圖像上的信息

    ` 具體一點就是處理圖像時通過Overlay在圖像上添加了一些有用的信息,保存圖像時如何連同這些信息一起保存在圖像上,例如中讀出來的條碼信息
    發(fā)表于 04-06 18:07

    請問內(nèi)存大小與硬盤大小是保存在注冊的哪個位置,鍵值是什么呢?

    如題,各位大視野,請問電腦的內(nèi)存大小與硬盤大小是保存在注冊的哪個位置,鍵值是什么呢?謝謝。
    發(fā)表于 04-26 10:08

    LABVIEW數(shù)據(jù)保存在EXCEL無法打開

    數(shù)據(jù)保存在文本文檔里可以打開,保存在EXCEL卻不行,顯示發(fā)現(xiàn)不可讀取的內(nèi)容,怎么辦啊。程序圖是這樣的。最后保存到文本文檔是這樣的。如果能保存在EXCEL了,怎么才能在這些數(shù)據(jù)上邊添加
    發(fā)表于 11-17 14:23

    系統(tǒng)報錯信息自動保存

    系統(tǒng)發(fā)生錯誤的時候怎樣把錯誤提示消息寫入到文檔自動保存???
    發(fā)表于 04-14 10:24

    用戶設置的參數(shù)動態(tài)信息保存方法有哪些呢

    前言:很多的嵌入式設備使用過程中,當系統(tǒng)掉電時,往往需要把一些用戶設置的參數(shù)保存起來,或者是將掉電前的一些狀態(tài)信息保存,或者是統(tǒng)計系統(tǒng)重啟次
    發(fā)表于 02-10 07:44

    為什么會有INT引腳的存在

    目錄11.1 INT的存在的意義11.2 I2C地址11.3 協(xié)議版本與讀取報點信息11.4 I2C讀取報點信息。11.5 LA抓取10點觸控報點數(shù)據(jù)。11.1 INT的存在的意義 I
    發(fā)表于 03-02 06:10

    如何將詳細信息保存在文本文件而不是EEPROM?

    我目前正在研究 DNSServer 提供的 CaptivePortalAdvanced 示例。這提供了一個名為“憑據(jù)”的草圖,其中憑據(jù)保存在 EEPROM 中。但我想將詳細信息保存在文本文件中,所以
    發(fā)表于 05-04 07:48

    錄音電話的保存信息

    錄音電話的保存信息              保存信息即錄音電話所能錄音
    發(fā)表于 12-31 14:41 ?1691次閱讀

    嵌入式linux軟件是怎樣保存數(shù)據(jù)參數(shù)的

    大多數(shù)軟件開發(fā)都會涉及到數(shù)據(jù)參數(shù)的保存與讀取,小至運行的單片機的軟件,大至操作系統(tǒng)級別的軟件(如linux,windows,mac),均會有專門的子程序或者模塊進行參數(shù)的保存和讀取。不
    發(fā)表于 10-20 16:40 ?1次下載