用到的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
這個字段已經被刪除了,不再有效。
注意:
- 如果字段類型為變長類型(如
varchar
),那么在atttypmod
中存儲的長度比實際長度多4。可見參考文檔1。 - 如果字段類型為
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