pg查询表所拥有的子表

来源:互联网 发布:提问软件 编辑:程序博客网 时间:2024/06/05 23:08

业务需求:

1.有两个schema 分别为a,b

2.schema a下有一张表,叫做a;schema b下有一张表,叫做b,b继承于a,即b为a的子表;其中表b.b可能存在,也可能不存在

在schema a进行删除前,需要判断它的表a是否存在与它不在同一个schema内的子表;如果子表存在,则父表不进行删除

可以清晰的看到,业务的难点,就是要得到schema a下的表a,它所拥有的子表schema名称和表名。

要完成以上业务需求,需要查询pg系统表。

由于子表使用inherits语法实现的,所以我们首先了解下pg_inherits表:


可以看到,pg_inherits表存了父表的oid和子表的oid

oid该如何得到呢?我们需要了解pg_class表

pg_class表里有relname表示表名,那么表所在的schema又如何确定呢?


可以清晰看到,就是用pg_namespace表的oid与pg_class表的relnamespace进行关联,并且用pg_namespace表的namespace过滤指定schema名称即可。


综上所述,通过以上三张表,我们可以完成期待完成的业务。


1.使用pg_namespace,pg_inherits,pg_class三张表关联,我们可以得到schema a的表a的子表名称及schema oid

select relname,relnamespacefrom(select inhrelid from pg_namespace,pg_class,pg_inherits where pg_namespace.oid=pg_class.relnamespace and pg_namespace.nspname='a' and relname='a' and pg_class.oid=pg_inherits.inhparent) a,pg_class bwhere a.inhrelid=b.oid


2.我们把上一步的sql作为嵌套子查询,即可以得到schema a的表a的子表的schema名称以及表名:

select relname as tablename,nspname as schemanamefrom(select relname,relnamespacefrom(select inhrelid from pg_namespace,pg_class,pg_inherits where pg_namespace.oid=pg_class.relnamespace and pg_namespace.nspname='a' and relname='a' and pg_class.oid=pg_inherits.inhparent) a,pg_class bwhere a.inhrelid=b.oid) c,pg_namespacewhere c.relnamespace=pg_namespace.oid;

结果如下图所示:



0 0
原创粉丝点击