pg查询表所拥有的子表

业务需求:

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;

结果如下图所示:



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
查询PG数据库中表的结构,可以使用以下SQL语句: SELECT column_name, data_type, character_maximum_length FROM information_schema.columns WHERE table_name = 'your_table_name'; 这个SQL语句会返回指定表的所有列名、数据类型和字符最大长度(如果适用)。你需要将"your_table_name"替换为你要查询的表的实际名称。这个语句使用了信息模式中的"columns"表来获取表的结构信息。 另外,你也可以使用PG系统表"pg_class"来查询表的结构信息。通过执行以下SQL语句,你可以获取表的列名、数据类型和其他相关信息: SELECT attname AS column_name, format_type(atttypid, atttypmod) AS data_type FROM pg_attribute WHERE attrelid = ( SELECT oid FROM pg_class WHERE relname = 'your_table_name' AND relkind = 'r' ) AND attnum > 0; 同样,你需要将"your_table_name"替换为你要查询的表的实际名称。这个语句使用了"pg_attribute"表和"pg_class"表来获取表的结构信息。 请注意,以上提供的SQL语句仅适用于PG数据库,对于其他数据库系统可能会有所不同。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [PostgreSQL中查看表结构的方法](https://blog.csdn.net/lukeUnique/article/details/130673634)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [postgresql用sql语句查询表结构](https://blog.csdn.net/SandayH/article/details/83141738)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值