postgresql用sql語句查詢表結構


用到的postgresql系統表

關於postgresql系統表,可以參考PostgreSQL 8.1 中文文檔-系統表

pg_class

記錄了數據庫中的表,索引,序列,視圖("關系")。
其中比較重要字段有:

  • relname 表,索引,視圖等的名字。
  • relnamespace 包含這個關系的名字空間(模式)的 OID,對應pg_namespace.oid
  • relkind r = 普通表,i = 索引,S = 序列,v = 視圖, c = 復合類型,s = 特殊,t = TOAST表

pg_namespace

記錄了數據庫的名字空間(模式)
其中比較重要的字段有:

  • nspname 名字空間的名字
  • nspowner 名字空間的所有者

pg_attribute

記錄了數據庫關於表的字段的信息。
其中比較重要的字段有:

  • attrelid 此列/字段所屬的表,對應於pg_class.oid
  • attname 字段名字
  • atttypid 這個字段的數據類型,對應於pg_type.oid
  • attlen 對於定長類型,typlen是該類型內部表現形式的字節數目。 對於變長類型,typlen 是負數。 -1 表示一種"變長"類型(有長度字屬性的數據), -2 表示這是一個 NULL 結尾的 C 字串。是本字段類型 pg_type.typlen 的拷貝。
  • attnum 字段數目。普通字段是從 1 開始計數的。系統字段, 比如 oid, 有(任意)正數。
  • atttypmod atttypmod 元組在創建表的時候 提供的類型相關的數據(比如,一個 varchar 字段的最大長度)。 它傳遞給類型相關的輸入和長度轉換函數當做第三個參數。 其值對那些不需要 atttypmod 的類型而言通常為 -1。
  • attnotnull 這代表一個非空約束。我們可以改變這個字段以打開或者關閉這個約束。
  • attisdropped 這個字段已經被刪除了,不再有效。

注意:

  1. 如果字段類型為變長類型(如varchar),那么在atttypmod中存儲的長度比實際長度多4。可見參考文檔1
  2. 如果字段類型為numeric,那么可通過atttypmod獲得長度、精度等信息,具體方式可見參考文檔2

pg_type

記錄了數據庫有關數據類型的信息。
其中比較重要的字段有:

  • typname 數據類型名字
  • typlen 對於定長類型,typlen是該類型內部表現形式的字節數目。 對於變長類型,typlen 是負數。 -1 表示一種"變長"類型(有長度字屬性的數據), -2 表示這是一個 NULL 結尾的 C 字串。

pg_description

記錄了數據庫中對象(表、字段等)的注釋。
其中比較重要的字段有:

  • objoid 這條描述所描述的對象的 OID。如果這條注釋是一個表或表中字段的注釋,那么,該值對應於pg_class.oid
  • objsubid 對於一個表字段的注釋,它是字段號,對應於pg_attribute.attnum。對於其它對象類型,它是零。
  • description 作為對該對象的描述的任意文本

查詢用戶表

SELECT a.oid,
       a.relname AS name,
       b.description AS comment
  FROM pg_class a
       LEFT OUTER JOIN pg_description b ON b.objsubid=0 AND a.oid = b.objoid
 WHERE a.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname='public') --用戶表一般存儲在public模式下
   AND a.relkind='r'
 ORDER BY a.relname

使用表名查詢表字段的定義

SELECT a.attnum,
       a.attname AS field,
       t.typname AS type,
       a.attlen AS length,
       a.atttypmod AS lengthvar,
       a.attnotnull AS notnull,
       b.description AS comment
  FROM pg_class c,
       pg_attribute a
       LEFT OUTER JOIN pg_description b ON a.attrelid=b.objoid AND a.attnum = b.objsubid,
       pg_type t
 WHERE c.relname = 'zc_zclx'
       and a.attnum > 0
       and a.attrelid = c.oid
       and a.atttypid = t.oid
 ORDER BY a.attnum

使用表oid查詢表字段的定義

SELECT a.attname AS field,
       t.typname AS type,
       a.attlen AS length,
       a.atttypmod AS lengthvar,
       a.attnotnull AS notnull,
       b.description AS comment
  FROM pg_attribute a 
       LEFT OUTER JOIN pg_description b ON a.attrelid=b.objoid AND a.attnum = b.objsubid,
       pg_type t
 WHERE a.attnum > 0
       and a.attrelid = 162903
       and a.atttypid = t.oid
 ORDER BY a.attnum

參考文檔

  1. PostgreSQL 9.0 modify pg_attribute.atttypmod extend variable char length avoid rewrite table
  2. PostgreSQL How can i decode the NUMERIC precision and scale in pg_attribute.atttypmod


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM