postgresql用sql語句查詢表結構

用到的postgresql系統表

關於postgresql系統表,能夠參考PostgreSQL 8.1 中文文檔-系統表php

pg_class

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

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

pg_namespace

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

  • 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

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

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

pg_description

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

  • 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
相關文章
相關標籤/搜索