业务需求:
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,relnamespace
from
(
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 b
where a.inhrelid=b.oid
2.我们把上一步的sql作为嵌套子查询,即可以得到schema a的表a的子表的schema名称以及表名:
select relname as tablename,nspname as schemaname
from
(
select relname,relnamespace
from
(
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 b
where a.inhrelid=b.oid
) c,pg_namespace
where c.relnamespace=pg_namespace.oid;
结果如下图所示: