这篇文章主要介绍了PostgreSQL 查看表的主外键等约束关系详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧。
我就废话不多说了,大家还是直接看代码吧~
postgres=# \d+ pg_depend
Table "pg_catalog.pg_depend"
Column | Type | Modifiers | Storage | Stats target | Description
————-+———+———–+———+————–+————-
classid | oid | not null | plain | | 系统OID
objid | oid | not null | plain | | 对象OID
objsubid | integer | not null | plain | |
refclassid | oid | not null | plain | | 引用系统OID
refobjid | oid | not null | plain | | 引用对象ID
refobjsubid | integer | not null | plain | |
deptype | "char" | not null | plain | | pg_depend类型
Indexes:
"pg_depend_depender_index" btree (classid, objid, objsubid)
"pg_depend_reference_index" btree (refclassid, refobjid, refobjsubid)
Has OIDs: no
–BTW:OID是Object Identifier的缩写,是对象ID的意思,因为是无符号的4字节类型,不够足够大,所以一般不用来做主键使用,仅系统内部,比如系统表等应用,可以与一些整型数字进行转换。与之相关的系统参数是default_with_oids,默认是off
postgres=# \d pg_constraint
Table "pg_catalog.pg_constraint"
Column | Type | Modifiers
—————+————–+———–
conname | name | not null — 约束名
connamespace | oid | not null — 约束所在命名空间的OID
contype | "char" | not null — 约束类型
condeferrable | boolean | not null — 约束是否可以推迟
condeferred | boolean | not null — 缺省情况下,约束是否可以推迟
convalidated | boolean | not null — 约束是否经过验证
conrelid | oid | not null — 约束所在的表的OID
contypid | oid | not null — 约束所在的域的OID
conindid | oid | not null — 如果是唯一、主键、外键或排除约束,则为支持这个约束的索引;否则为0
confrelid | oid | not null — 如果是外键,则为参考的表;否则为 0
confupdtype | "char" | not null — 外键更新操作代码
confdeltype | "char" | not null — 外键删除操作代码
confmatchtype | "char" | not null — 外键匹配类型
conislocal | boolean | not null
coninhcount | integer | not null — 约束直接继承祖先的数量
connoinherit | boolean | not null
conkey | smallint[] | — 如果是表约束(包含外键,但是不包含约束触发器),则是约束字段的列表
confkey | smallint[] | — 如果是一个外键,是参考的字段的列表
conpfeqop | oid[] | — 如果是一个外键,是PK = FK比较的相等操作符的列表
conppeqop | oid[] | — 如果是一个外键,是PK = PK比较的相等操作符的列表
conffeqop | oid[] | — 如果是一个外键,是FK = FK比较的相等操作符的列表
conexclop | oid[] | — 如果是一个排除约束,是每个字段排除操作符的列表
conbin | pg_node_tree | — 如果是一个检查约束,那就是其表达式的内部形式
consrc | text | — 如果是检查约束,则是表达式的人类可读形式
Indexes:
"pg_constraint_oid_index" UNIQUE, btree (oid)
"pg_constraint_conname_nsp_index" btree (conname, connamespace)
"pg_constraint_conrelid_index" btree (conrelid)
"pg_constraint_contypid_index" btree (contypid)
coninhcount | integer | not null — 约束直接继承祖先的数量 connoinherit | boolean | not null
conkey | smallint[] | — 如果是表约束(包含外键,但是不包含约束触发器),则是约束字段的列表 confkey | smallint[] | — 如果是一个外键,是参考的字段的列表 conpfeqop | oid[] | — 如果是一个外键,是PK = FK比较的相等操作符的列表 conppeqop | oid[] | — 如果是一个外键,是PK = PK比较的相等操作符的列表 conffeqop | oid[] | — 如果是一个外键,是FK = FK比较的相等操作符的列表 conexclop | oid[] | — 如果是一个排除约束,是每个字段排除操作符的列表 conbin | pg_node_tree | — 如果是一个检查约束,那就是其表达式的内部形式 consrc | text | — 如果是检查约束,则是表达式的人类可读形式Indexes: "pg_constraint_oid_index" UNIQUE, btree (oid) "pg_constraint_conname_nsp_index" btree (conname, connamespace) "pg_constraint_conrelid_index" btree (conrelid) "pg_constraint_contypid_index" btree (contypid)
pg_depend.deptype字段类型9.1之后多了一个extension的类型,目前类型有
DEPENDENCY_NORMAL (n) :普通的依赖对象,如表与schema的关系
DEPENDENCY_AUTO (a) :自动的依赖对象,如主键约束
DEPENDENCY_INTERNAL (i) :内部的依赖对象,通常是对象本身
DEPENDENCY_EXTENSION (e) :9.1新增的的扩展依赖
DEPENDENCY_PIN (p) :系统内置的依赖
(p) :系统内置的依赖
二、例子
wiki上有一个SQL可以列出系统和用户对象的各种依赖关系,低版本的可以看wiki上的另一个写法
SELECT classid::regclass AS "depender object class",
CASE classid
WHEN 'pg_class'::regclass THEN objid::regclass::text
WHEN 'pg_type'::regclass THEN objid::regtype::text
WHEN 'pg_proc'::regclass THEN objid::regprocedure::text
ELSE objid::text
END AS "depender object identity",
objsubid,
refclassid::regclass AS "referenced object class",
CASE refclassid
WHEN 'pg_class'::regclass THEN refobjid::regclass::text
WHEN 'pg_type'::regclass THEN refobjid::regtype::text
WHEN 'pg_proc'::regclass THEN refobjid::regprocedure::text
ELSE refobjid::text
END AS "referenced object identity",
refobjsubid,
CASE deptype
WHEN 'p' THEN 'pinned'
WHEN 'i' THEN 'internal'
WHEN 'a' THEN 'automatic'
WHEN 'n' THEN 'normal'
END AS "dependency type"
FROM pg_catalog.pg_depend WHERE (objid >= 16384 OR refobjid >= 16384);
BTW:我通常喜欢在where后面加个条件 and deptype <>'i' 排除internal依赖
postgres=# create table tbl_parent(id int);
CREATE TABLE
postgres=# 执行上面的SQL;
depender object class | depender object identity | objsubid | referenced object class | referenced object identity | refobjsubid | dependency type
———————–+————————–+———-+————————-+————- pg_class | tbl_parent | 0 | pg_namespace | 2200 | 0 | normal
(1 row)
–普通用户来看只是建了个表,但是没有约束,其实因为这个表是建立在schema下面,表是依赖于schema上面的
加一个主键约束
postgres=# alter table tbl_parent add primary key(id);
ALTER TABLE
depender object class | depender object identity | objsubid | referenced object class | referenced object identity | refobjsubid | dependency type
———————–+————————–+———-+————————-+——- pg_class | tbl_parent | 0 | pg_namespace | 2200 | 0 | normal
pg_constraint | 16469 | 0 | pg_class | tbl_parent | 1 | automatic
(2 rows)
–多了一个约束的信息,下面的这条信息表明这个主键约束是依赖于表上的,并且是自动模式,详细信息可以在系统表pg_constrant里面查询

