catalogs 系统表
官方文档: 第 51 章 系统目录
[表] 隐藏字段
oid
: 行标示符- 创建表的时候使用了
WITH OIDS
,或者是设置了配置参数default_with_oids
时出现 - 字段的类型是
oid
,和字段同名 OID
是32位的量,有可能重叠
- 创建表的时候使用了
tableoid
: 所在的oid
,对应pg_class
中的oid
。从继承层次中选取的查询特别有用xmin
: 插入该行版本的事务的标识(事务ID)cmin
: 在插入事务内部的命令标识(从零开始)。xmax
: 删除事务的标识(事务ID),如果不是被删除的行版本,那么是零。cmax
: 在删除事务内部的命令标识符,或者是零。ctid
: 一个行版本在它所处的表内的物理位置
select tableoid::regclass as tablename,
oid, tableoid, cmax, cmin, xmin, xmax, ctid
from pg_database;
-- ------------------------------
select attr.*
from pg_class class,
pg_attribute attr
where 1 = 1
and class.relname = '表名'
and class.oid = attr.attrelid -- and attr.attstattarget = 0;
[表] pg_database
所有的数据库
datname
数据库名
[表] pg_namespace
当前数据库的 Schema
nspname
schema 的名字nspowner
schema 所有者 idpg_authid.oid
|pg_get_userbyid(xx)
[表] pg_class
relkind
字段标明,当前对象的类型:r
= 普通表,i
= 索引, S
= 序列,t
= TOAST 表,v
= 视图, m
= 物化视图, c
= 组合类型, f
= 外部表, p
= 分区表
relname
表、索引、视图 等,名字relnamespace
:pg_namespace.oid
[表] pg_attribute
表的字段的信息
attrelid
字段所属的表,对应于pg_class.oid
attname
字段名字atttypid
这个字段的数据类型,对应于pg_type.oid
attlen
字段长度,pg_type.typlen
的拷贝attnotnull
这代表一个非空约束。我们可以改变这个字段以打开或者关闭这个约束
[表] pg_type
数据类型的信息
typname
数据类型名字typlen
- 定长类型:是该类型内部表现形式的字节数目
- 变长类型,typlen 是负数
- -1 表示一种"变长"类型(有长度字属性的数据)
- -2 表示这是一个 NULL 结尾的 C 字串。
[表] pg_description
数据库中对象(表、字段等)的注释。
objoid
表 、表中字段的注释,对应pg_class.oid
objsubid
对于一个表字段的注释,它是字段号,对应于pg_attribute.attnum
,表字段类型是 0description
表、字段 注释
常用 SQL
表结构
SELECT ns.nspname, -- schemaName
cla.OID,
cla.relname, -- tableName
attr.attname, -- 列名
attr.attlen, -- 列类型长度长度
attr.attnotnull, -- 非空
attr.attnum, -- 列顺序
tp.typname, -- 类型名
format_type(attr.atttypid, attr.atttypmod),
col_description(attr.attrelid, attr.attnum), -- 列注释
def.adsrc -- 默认值
from pg_namespace ns
inner join pg_class cla on cla.relnamespace = ns.OID
inner join pg_attribute attr on attr.attrelid = cla.OID and attr.attnum > 0
inner join pg_type tp on attr.atttypid = tp.OID
left outer join pg_attrdef def on def.adrelid = cla.OID and def.adnum = attr.attnum
where 1 = 1
and ns.nspname = 'namespase'
and cla.relname = 'tablename'
order by ns.nspname, cla.relname, attr.attnum
表注释
SELECT clas.oid,
clas.relname AS table_name,
dsk.description AS comment
FROM pg_class clas
LEFT JOIN pg_description dsk ON dsk.objsubid = 0 AND clas.oid = dsk.objoid
WHERE clas.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'schemaName')
AND clas.relkind = 'r'
ORDER BY clas.relname
确认一个对象是表还是视图
select ns.nspname,
clas.relname,
clas.relkind
from pg_namespace ns,
pg_class clas
where clas.relnamespace = ns.OID
and ns.nspname = 'schemaName'
and clas.relname = 'tableName'