pgsql_postgresql表的继承关系查询

news/2024/7/9 21:31:04 标签: postgresql, 数据库

pgsql_postgresql表的继承关系查询

  • pgsql_postgresql表的继承关系查询
    • 前言
    • 向上反查表的继承关系SQL
    • 系统表说明
      • pg_class
      • pg_namespace
      • pg_inherits
      • pgsql with 语法

postgresql_1">pgsql_postgresql表的继承关系查询

前言

表继承是pgsql的一个特性,通过表继承可以方便的实现表数据的横向拆分(表分区),从而实现对数据做物理隔离等操作。
继承有别于表分区,继承可以很多层级。

比如存储省、市、区的数据时,即要物理隔离每层数据又要按层级统一查询,此时做个带有继承关系的表是很好的实现方式。
实现方法是,建立三个shcema为 province、city、region,每个schema中建立一个表 persion ,并实现继承关系如下:
province.persion <- city.persion <- region.persion。

管理继承关系是个麻烦事,如果库中有1000张表,有部分表没有实现三级继承关系,如何排查?

下面的脚本是一个向上反查父级的SQL,通过叶子表向上反查三层,既可以得到所有表的继承关系,每行是一个表的继承信息。

向上反查表的继承关系SQL

with tab as (
    --表名+schema名
    select a.oid,a.relname,b.nspname,concat(nspname,'.',relname) as tab_full_name from pg_class a,pg_namespace b where a.relnamespace=b.oid
)
--继承关系详情
select
    (select tab_full_name from tab where oid=t.l3_oid limit 1) l3,
    (select tab_full_name from tab where oid=t.l2_oid limit 1) l2,
    (select tab_full_name from tab where oid=t.l1_oid limit 1) l1
from
(
    --以叶子表反查继承关系
    select pgt.oid tab_oid,
           pgt.relname,
           pgn.nspname,
           level3.inhrelid as l3_oid,
           level2.inhrelid as l2_oid,
           level1.inhrelid as l1_oid
    from pg_class pgt
         -- 限定schema的普通表(叶子级schema)
         join pg_namespace pgn on pgt.relnamespace = pgn.oid and pgt.relkind = 'r' and pgn.nspname = 'my_schema_name'
         -- 查是否存在继承
         left join pg_inherits level3 on pgt.oid = level3.inhrelid
         -- 查父级
         left join pg_inherits level2 on level3.inhparent = level2.inhrelid
         -- 查父级的父级
         left join pg_inherits level1 on level2.inhparent = level1.inhparent
) t;

系统表说明

pg_class

pgsql也是面向对象的,看pg_class就知道,该表内记录了pgsql中的所有对象(表、视图、主键…),其中查询普通表对象的脚本是:

select * from pg_class where relkind='r';

pg_namespace

表的命名空间信息,即表的schema名字。

--查询表命名空间
select a.oid,a.relname,b.nspname,concat(b.nspname,'.',a.relname) fullname 
from pg_class a,pg_namespace b
where a.relnamespace=b.oid and b.nspname='assy_def_crp' and relkind='r' ;

pg_inherits

表的继承关系,比较简单只记录了父表ID。

select * from pg_inherits;

pgsql with 语法

WITH提供了一种编写辅助语句的方法,以便在较大的查询中使用。这些语句通常被称为公共表表达式或CTE,可以认为它们定义了仅为一个查询而存在的临时表。WITH子句中的每个辅助语句可以是SELECT、INSERT、UPDATE或DELETE;WITH子句本身附加到主语句,主语句也可以是SELECT、INSERT、UPDATE或DELETE。
这里我们只用到了Select查询。

with tab as (
    --表名+schema名
    select a.oid,a.relname,b.nspname,concat(nspname,'.',relname) as tab_full_name from pg_class a,pg_namespace b where a.relnamespace=b.oid
)

可以声明多个临时表,之间用逗号分割:

with
    q1 as (select 1),
    q2 as (select 2),
    q3 as (select 3)
select * from q1
union all
select * from q2
union all
select * from q3;

http://www.niftyadmin.cn/n/5266232.html

相关文章

基于若依搭建微服务nacos版本(ruoyi-Cloud前后端分离)

说明&#xff1a;本文介绍基于Ruoyi-Cloud前后端分离nacos版本的微服务从0到1的搭建过程&#xff0c;同时新增一个新的微服务模块。是基于官方文档的补充说明&#xff0c;需要结合Ruoyi-Cloud的官方文档 https://doc.ruoyi.vip/ruoyi-cloud/ 如果直接查看官方文档便可成功部署&…

怎么选择合适的3ds Max云渲染农场?

3ds Max 用户日常面临的一个共同挑战便是漫长的渲染周期。作为一个强大的三维建模和渲染软件&#xff0c;3ds Max 势必需处理大量的光照、材质和阴影计算任务&#xff0c;因此&#xff0c;良好的渲染方案对从业者而言尤为重口。 一、为何考虑3ds Max云渲染? 云渲染成为了解决…

【每次启动wsl时自动更新ip】

每次启动wsl时自动更新ip 在windows中使用wsl时&#xff0c;每次启动wsl后发现其ip都会改变&#xff0c;这样的话如果想通过vscode的Remote-SSH插件打开代码编辑器&#xff0c;就需要手动更新ssh配置文件&#xff0c;极为不便&#xff0c;所以考虑使用一种优雅的方式&#xff0…

Linux学习笔记-Ubuntu下ssh服务器连接异常Connection reset

文章目录 一、问题问题现象1.1 连接重置无法访问的的问题1.2 查看服务器连接状态1.3 使用调试模式查看的信息 二、临时解决方法三、从根源解决问题3.1 问题分析3.2 服务器的ssh日志3.3 修改ssh配置禁止root登录3.4 配置允许所有ip访问3.5 修改认证方法 角色&#xff1a;百世经纶…

最新50万字312道Java经典面试题52道场景题总结(附答案PDF)

最近有很多粉丝问我&#xff0c;有什么方法能够快速提升自己&#xff0c;通过阿里、腾讯、字节跳动、京东等互联网大厂的面试&#xff0c;我觉得短时间提升自己最快的手段就是背面试题&#xff1b;花了3个月的时间将市面上所有的面试题整理总结成了一份50万字的300道Java高频面…

深度学习实战67-基于Stable-diffusion的图像生成应用模型的搭建,在Kaggle平台的搭建部署,解决本地没有算力资源问题

大家好,我是微学AI,今天给大家介绍一下深度学习实战67-基于Stable-diffusion的图像生成应用模型的搭建,在Kaggle平台的搭建部署,解决本地没有算力资源问题。稳定扩散模型(Stable Diffusion Model)是一种用于图像增强和去噪的计算机视觉算法。它通过对输入图像进行扩散过程…

统一观测丨使用 Prometheus 监控 Memcached 最佳实践

作者&#xff1a;啃唯 Memcached 简介 Memcached 是什么&#xff1f; Memcached 是一个免费开源、高性能、分布式内存对象缓存系统&#xff0c;支持将任意数据类型的 chunk 数据以键值对的方式存储。本质上 Memcached 是通用于所有的应用的&#xff0c;但最初用于存储被经常…

C语言----文件操作(二)

在上一篇文章中我们简单介绍了在C语言中文件是什么以及文件的打开和关闭操作&#xff0c;在实际工作中&#xff0c;我们不仅仅是要打开和关闭文件&#xff0c;二是需要对文件进行增删改写。本文将详细介绍如果对文件进行安全读写。 一&#xff0c;以字符形式读写文件&#xff…