七叶笔记 » 数据库 » PostgreSQL 查看表的主外键等约束关系详解

PostgreSQL 查看表的主外键等约束关系详解

constraint_type有四种:

通过修改上边sql语句的table_name和constraint_type来进行相应的查询

补充:PostgreSQL查询约束和创建删除约束

查询约束constraint

constraint_type有四种:

UNIQUE、PRIMARY KEY、CHECK、FOREIGN KEY, 通过修改上边sql语句的table_name和constraint_type来进行相应的查询。

添加约束 删除约束

补充:PostgreSQL的依赖约束(系统表pg_depend和pg_constraint)详解

pg_depend是postgres的一张系统表,用来记录数据库对象之间的依赖关系,除了常见的主外键,还有其他一些内部依赖关系,可以通过这个系统表呈现出来。

一、表结构:

--BTW:OID是Object Identifier的缩写,是对象ID的意思,因为是无符号的4字节类型,不够足够大,所以一般不用来做主键使用,仅系统内部,比如系统表等应用,可以与一些整型数字进行转换。与之相关的系统参数是default_with_oids,默认是off

pg_depend.deptype字段类型9.1之后多了一个extension的类型,目前类型有

二、例子

wiki上有一个SQL可以列出系统和用户对象的各种依赖关系,低版本的可以看wiki上的另一个写法

BTW:我通常喜欢在where后面加个条件 and deptype <>'i' 排除internal依赖

建一张普通的表,执行上面的SQL

--普通用户来看只是建了个表,但是没有约束,其实因为这个表是建立在schema下面,表是依赖于schema上面的

加一个主键约束

--多了一个约束的信息,下面的这条信息表明这个主键约束是依赖于表上的,并且是自动模式,详细信息可以在系统表pg_constrant里面查询

三、非正常删除

正常情况下用户删除有依赖关系的对象时会提示需要先删除最里层没依赖的对象,但是如果通过删除系统表,但又删得不对,就会导致异常,比如上面这个例子会出现 cache lookup failed for constraint

--出现这个问题,是因为手工把约束对象删除了,但是在pg_depend依赖关系里面却仍然存在关系,所以删除该表时发现最里层的依赖对象找不到了就报错了,

解决:

1.手工恢复该表的约束对象,比较难也比较烦

2.删除该表所有的系统依赖信息 上面的问题需要删除

3.要说一点的是不要去手工删除一些系统表信息来达到删除约束的目的,容易因删不干净而造成各种异常

以上为个人经验,希望能给大家一个参考,也希望大家多多支持七叶笔记。如有错误或未考虑完全的地方,望不吝赐教。

相关文章