pgsql_postgresql表的继承关系查询

news/2025/2/22 19:11:20/

pgsql_postgresql表的继承关系查询

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

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_oidfrom 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
)

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

withq1 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.ppmy.cn/news/1271557.html

相关文章

【EventBus】EventBus源码浅析

二、EventBus源码解析 目录 1、EventBus的构造方法2、订阅者注册 2.1 订阅者方法的查找过程2.2 订阅者的注册过程1. subscriptionsByEventType 映射&#xff1a;2. typesBySubscriber 映射&#xff1a;2.3 总结订阅者的注册过程 3、事件的发送 3.1 使用Post提交事件3.2 使用p…

假如董宇辉是个AI

董宇辉这么质朴、勤奋、爱动感情又有灵气的带货主播&#xff0c;配得上他的上千万粉丝。他是直播带货的一股清流&#xff0c;罕见的品类和物种。 然而&#xff0c;是东方甄选成就了董宇辉&#xff0c;还是董宇辉托起了东方甄选&#xff0c;真是笔说不清的糊涂账。董宇辉为什么…

node-red中输出当前时间

在node-red中输出当前时间&#xff0c;并指定时区为北京时间&#xff0c;时间格式为&#xff1a;YYYY-MM-DD HH:mm:ss 可以使用moment.js库&#xff0c;也可以自行写一个function&#xff0c;介绍一下使用自定义function的方法。 var now new Date(); var formattedDate …

玩转大数据18:大规模数据处理与分布式任务调度

引言 在数字化时代&#xff0c;数据成为了一种宝贵的资源&#xff0c;对于企业和组织来说&#xff0c;如何有效地处理和分析这些数据成为了关键的竞争力。大规模数据处理与分布式任务调度作为大数据处理的核心技术&#xff0c;为解决这一问题提供了有效的解决方案。 随着数据…

laravel的安装

laravel的安装&#xff08;Composer小皮&#xff09; Composer的安装 windows下安装 https://getcomposer.org/Composer-Setup.exe 修改镜像 阿里云&#xff1a; composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 华为云&#xff1a; compos…

Vue3-03-reactive() 响应式基本使用

reactive() 的简介 reactive() 是vue3 中进行响应式状态声明的另一种方式&#xff1b; 但是&#xff0c;它只能声明 【对象类型】的响应式变量&#xff0c;【不支持声明基本数据类型】。reactive() 与 ref() 一样&#xff0c;都是深度响应式的&#xff0c;即对象嵌套属性发生了…

大语言模型:开启自然语言处理新纪元

导言 大语言模型&#xff0c;如GPT-3&#xff08;Generative Pre-trained Transformer 3&#xff09;&#xff0c;标志着自然语言处理领域取得的一项重大突破。本文将深入研究大语言模型的基本原理、应用领域以及对未来的影响。 1. 简介 大语言模型是基于深度学习和变压器&…

maui下sqlite演示增删改查

数据操作类 有分页 todoitemDatabase.cs&#xff1a; using SQLite; using TodoSQLite.Models;namespace TodoSQLite.Data {public class TodoItemDatabase{SQLiteAsyncConnection Database;public TodoItemDatabase(){}// 初始化数据库连接和表async Task Init(){if (Databa…