特性介绍 | PostgreSQL 的依赖约束详解 - 系统表 pg_depend & pg_constraint

一次有关pg_depend 错误处理 http://blog.youkuaiyun.com/yibei8811/article/details/46623253 上篇算是比较详细的说明了pg_depend表的含义。 本篇记录一次有关的问题处理。 执行:drop schema public cascade出错返回: ERROR: cache lookup failed for relation 24662 ********** 错误 ** 阅读详情

本文首发于 2015-11-04 15:28:08

前言

本文成文较早,依赖的是 PostgreSQL 9.3 版本,后续内核版本可能不兼容,但核心原理是相通的,可做参考。

表结构

pg_depend

pg_depend 是 postgres 的一张系统表,用来记录数据库对象之间的依赖关系,除了常见的主外键,还有其他一些内部依赖关系,可以通过这个系统表呈现出来。

postgres=# \d+ pg_depend
                       Table "pg_catalog.pg_depend"
   Column    |  Type   | Modifiers | Storage | Stats target | Description
-------------+---------+-----------+---------+--------------+-------------
 classid     | oid     | not null  | plain   |              | 系统OID
 objid       | oid     | not null  | plain   |              | 对象OID
 objsubid    | integer | not null  | plain   |              |
 refclassid  | oid     | not null  | plain   |              | 引用系统OID
 refobjid    | oid     | not null  | plain   |              | 引用对象ID
 refobjsubid | integer | not null  | plain   |              |
 deptype     | "char"  | not null  | plain   |              | pg_depend类型
Indexes:
    "pg_depend_depender_index" btree (classid, objid, objsubid)
    "pg_depend_reference_index" btree (refclassid, refobjid, refobjsubid)
Has OIDs: no

OID 是 Object Identifier 的缩写,是对象 ID 的意思,因为是无符号的4字节类型,表示范围不够大,所以一般不用做主键使用,仅用在系统内部,比如系统表等应用。可以与一些整型数字进行转换。与之相关的系统参数是 default_with_oids ,默认是 off 。

pg_depend.deptype 字段自 9.1 版本之后多了一个 extension 的类型,目前类型有:

DEPENDENCY_NORMAL (n) :普通的依赖对象,如表与schema的关系。
DEPENDENCY_AUTO (a) :自动的依赖对象,如主键约束。
DEPENDENCY_INTERNAL (i) :内部的依赖对象,通常是对象本身。
DEPENDENCY_EXTENSION (e) :9.1新增的的扩展依赖。
DEPENDENCY_PIN (p) :系统内置的依赖。

pg_constraint

postgres=# \d pg_constraint
     Table "pg_catalog.pg_constraint"
    Column     |     Type     | Modifiers 
---------------+--------------+-----------
 conname       | name         | not null        -- 约束名
 connamespace  | oid          | not null        -- 约束所在命名空间的OID
 contype       | "char"       | not null        -- 约束类型
 condeferrable | boolean      | not null        -- 约束是否可以推迟
 condeferred   | boolean      | not null        -- 缺省情况下,约束是否可以推迟
 convalidated  | boolean      | not null        -- 约束是否经过验证
 conrelid      | oid          | not null        -- 约束所在的表的OID
 contypid      | oid          | not null        -- 约束所在的域的OID
 conindid      | oid          | not null        -- 如果是唯一、主键、外键或排除约束,则为支持这个约束的索引;否则为0
 confrelid     | oid          | not null        -- 如果是外键,则为参考的表;否则为 0
 confupdtype   | "char"       | not null        -- 外键更新操作代码
 confdeltype   | "char"       | not null        -- 外键删除操作代码
 confmatchtype | "char"       | not null        -- 外键匹配类型
 conislocal    | boolean      | not null        
 coninhcount   | integer      | not null        -- 约束直接继承祖先的数量
 connoinherit  | boolean      | not null        
 conkey        | smallint[]   |         -- 如果是表约束(包含外键,但是不包含约束触发器),则是约束字段的列表
 confkey       | smallint[]   |         -- 如果是一个外键,是参考的字段的列表
 conpfeqop     | oid[]        |         -- 如果是一个外键,是PK = FK比较的相等操作符的列表
 conppeqop     | oid[]        |        -- 如果是一个外键,是PK = PK比较的相等操作符的列表
 conffeqop     | oid[]        |         -- 如果是一个外键,是FK = FK比较的相等操作符的列表
 conexclop     | oid[]        |         -- 如果是一个排除约束,是每个字段排除操作符的列表
 conbin        | pg_node_tree |         -- 如果是一个检查约束,那就是其表达式的内部形式
 consrc        | text         |         -- 如果是检查约束,则是表达式的人类可读形式
Indexes:
    "pg_constraint_oid_index" UNIQUE, btree (oid)
    "pg_constraint_conname_nsp_index" btree (conname, connamespace)
    "pg_constraint_conrelid_index" btree (conrelid)
    "pg_constraint_contypid_index" btree (contypid)

查询依赖关系的 SQL

如下 SQL 可以列出系统和用户对象的各种依赖关系:

SELECT classid::regclass AS "depender object class",
    CASE classid
        WHEN 'pg_class'::regclass THEN objid::regclass::text
        WHEN 'pg_type'::regclass THEN objid::regtype::text
        WHEN 'pg_proc'::regclass THEN objid::regprocedure::text
        ELSE objid::text
    END AS "depender object identity",
    objsubid,
    refclassid::regclass AS "referenced object class",
    CASE refclassid
        WHEN 'pg_class'::regclass THEN refobjid::regclass::text
        WHEN 'pg_type'::regclass THEN refobjid::regtype::text
        WHEN 'pg_proc'::regclass THEN refobjid::regprocedure::text
        ELSE refobjid::text
    END AS "referenced object identity",
    refobjsubid,
    CASE deptype
        WHEN 'p' THEN 'pinned'
        WHEN 'i' THEN 'internal'
        WHEN 'a' THEN 'automatic'
        WHEN 'n' THEN 'normal'
    END AS "dependency type"
FROM pg_catalog.pg_depend WHERE (objid >= 16384 OR refobjid >= 16384);

我通常喜欢在 where 后面加个条件 and deptype <>'i' ,以排除 internal 依赖。

示例

创建一张表:

postgres=# create table tbl_parent(id int);
CREATE TABLE

执行查询依赖关系的 SQL:

postgres=# 执行上面的SQL;
 depender object class | depender object identity | objsubid | referenced object class | referenced object identity | refobjsubid | dependency type
-----------------------+--------------------------+----------+-------------------------+------------- pg_class              | tbl_parent               |        0 | pg_namespace            | 2200                       |           0 | normal
(1 row)

看起来只是建了个表,没有约束,实际上该表是建立在 schema 下面的,因此只依赖于 schema 。

添加主键约束:

postgres=# alter table tbl_parent add primary key(id);
ALTER TABLE
 depender object class | depender object identity | objsubid | referenced object class | referenced object identity | refobjsubid | dependency type
-----------------------+--------------------------+----------+-------------------------+------- pg_class              | tbl_parent               |        0 | pg_namespace            | 2200                       |           0 | normal
 pg_constraint         | 16469                    |        0 | pg_class                | tbl_parent                 |           1 | automatic
(2 rows)

约束类型变为了automatic,表明这个主键约束是依赖于表上的,是自动模式,详细信息可以在系统表 pg_constrant 里面查询。

正常情况下用户删除有依赖关系的对象时,会提示需要先删除依赖的对象。但是如果通过系统表删除有依赖关系的对象时,若操作有误,就会导致异常。例如:下面的操作就会导致报错cache lookup failed for constraint:

postgres=# select oid,conname,connamespace,contype from pg_constraint where conname like 'tbl_parent%';
  oid  |     conname     | connamespace | contype
-------+-----------------+--------------+---------
 16469 | tbl_parent_pkey |         2200 | p
(1 row)
 
postgres=# delete from pg_constraint where conname like 'tbl_parent%';
DELETE 1
postgres=# select oid,conname,connamespace,contype from pg_constraint where conname like 'tbl_parent%';
 oid | conname | connamespace | contype
-----+---------+--------------+---------
(0 rows)
 
postgres=# drop table tbl_parent;
ERROR:  cache lookup failed for constraint 16469   --16496是约束的OID
postgres=#

之所以出现该报错,是因为手动把约束对象删除了,但在 pg_depend 里却仍然存在依赖关系,因此,删除该表时,由于找不到最里层的依赖对象而报错。


欢迎关注我的微信公众号【数据库内核】:分享主流开源数据库和存储引擎相关技术。

标题网址
GitHubhttps://dbkernel.github.io
知乎https://www.zhihu.com/people/…
思否(SegmentFault)https://segmentfault.com/u/db…
掘金https://juejin.im/user/5e9d3e…
开源中国(oschina)https://my.oschina.net/dbkernel
博客园(cnblogs)https://www.cnblogs.com/dbkernel
postgres中pg_depend表实验性分析 名字 类型 引用 描述 classid oid pg_class.oid 有倚赖对象所在系统表的 OID objid oid 任意 OID 属性 指定的依赖对象的 OID objsubid int4   对于表字段,这个是该属性的字段数(objid和classid 引用表本身) 阅读详情

相关推荐

PostgreSQL 标识列进阶:从 SERIAL 迁移到 IDENTITY 的 5 个关键步骤与性能影响

本文详细介绍了从PostgreSQL的SERIAL迁移到IDENTITY约束的完整实践指南,涵盖5个关键步骤与性能影响分析。通过对比SERIAL与GENERATED AS IDENTITY的技术差异,提供迁移前的评估方法、自动化转换脚本、权限处理方案以及性能优化建议,帮助开发者和DBA实现平滑过渡并提升数据库标准化水平。

anjichan4261的博客 376

Spring Boot项目集成MyBatis Plus操作PostgreSQL全解析

集成 Spring Boot、PostgreSQL 和 MyBatis Plus 的步骤与 MyBatis 类似,只不过在 MyBatis Plus 中提供了更多的便利功能,如自动生成 SQL、分页查询、Wrapper 查询等。

盹猫的博客 3816

SQL外键实战:从数据一致性到生产级性能优化

外键(Foreign Key)是关系型数据库保障数据一致性的核心机制,其本质是数据库引擎在事务层实现的双向、原子化引用约束。它通过主键索引探查、行级锁协同与元数据缓存,在插入、更新、删除时实时拦截非法关联,彻底消除应用层校验的时间窗口漏洞。相比代码模拟,外键提供强一致性保障与声明式维护能力,技术价值体现在故障防御(如防止孤儿订单)、运维提效(自动级联/置空)和模型可演进性上。典型应用场景包括电商订单与用户/商品的关联建模、多对多桥接表设计、历史快照保留等。本文聚焦真实生产环境中的外键落地——覆盖MySQL/

cumo7370的博客 1648

postgres学习笔记之regclass数据类型

一,基础知识 oid用来在整个数据集簇中唯一标识一个数据库对象,对象可以是数据库、表、索引、视图、元组等等。 对于pg中的对象来说,oid与表名存在对象关系,这个关系我们可以从pg_class中得到。 二关于regclass regclass是一种数据类型,它实际上是oid的别名。相当于是oid和对象名之间的双向符号,既可以把oid翻译成表名,也可以把表名翻译成oid 通过使用::regclass, 我们就不需要通过查询pg_class表来获取对象与oid的对应关系了。 举例: ------把oid翻译成表

weixin_44847119的博客 4756

openGauss ALTER TABLE 语句深度解析:原理、锁机制与在线变更实战

在数据库管理与运维中,表结构变更是支撑业务迭代与性能优化的核心操作。其原理主要涉及元数据修改与数据重写两种机制,前者仅更新系统目录,速度极快;后者则需物理读写数据,代价高昂。从技术价值看,安全高效的表结构变更能力是保障数据库持续可用性与数据完整性的基石,尤其在高并发、7x24小时在线的业务场景下至关重要。应用场景广泛,包括但不限于添加业务字段、调整索引与约束、进行存储优化以及管理分区表。本文将聚焦于 openGauss 数据库,深入剖析其 ALTER TABLE 语句的锁机制与执行原理,并探讨如何实现低影响

weixin_34221773的博客 433

PostgreSQL的依赖约束详解 - 系统表pg_depend和pg_constraint

通过分析pg_depend和pg_constraint表的内容,可以深入了解PostgreSQL数据库中对象之间的依赖关系和约束信息。希望本文对您理解PostgreSQL的依赖约束以及系统表pg_depend和pg_constraint的使用有所帮助。refobjsubid:表示依赖目标对象的子对象标识符,如果依赖目标对象不是复合对象,则为0。objsubid:表示依赖源对象的子对象标识符,如果依赖源对象不是复合对象,则为0。classid:表示依赖源对象所属的系统表的OID。

XwlyVue的博客 1016

PostgreSQL的pg_depend详解

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

weixin_33811539的博客 1334

Unity AR开发实战:从Vuforia图片识别到实体识别全流程解析

增强现实(AR)技术通过计算机视觉算法将虚拟信息叠加到现实世界,其核心原理在于对现实环境的感知与理解。在移动端AR开发中,图像识别与物体识别是实现虚实融合的关键技术,它们决定了虚拟内容能否准确、稳定地与现实对象对齐。Vuforia作为成熟的商业AR SDK,为开发者提供了从平面图像识别(Image Target)到三维实体识别(Model Target)的完整解决方案,极大降低了计算机视觉技术的应用门槛。在工程实践中,Vuforia通过封装复杂的特征提取与匹配算法,使开发者能够专注于交互设计与内容制作,广泛

weixin_30972263的博客 303

maven中连接Postgresql依赖

【代码】maven中连接Postgresql依赖。

m0_67403240的博客 2895

玩转RecyclerView | 实现子视图叠加 | 3D画廊效果 | 高级动效 | Android 3D坐标系介绍

之前写的一篇文章展示了RecyclerView实现的画廊效果,适用于专辑/图片/列表浏览效果。本篇文章阐述如何基于RecyclerView实现如下图所示的3D画廊效果。以下效果的重点在于实现子视图的图层叠加,滑动过程中的3D旋转效果较为简单。(1)无3D旋转效果图片(1)带3D旋转效果图片。

qq_38237224的博客 8159

OpenClaw安装方式那么多,但建议大家还是用云厂商吧

OpenCloud的安装方式多样,包括One-liner、npm、pnpm和Hackable等。One-liner提供高效的单行命令安装;npm和pnpm作为Node.js包管理工具,分别提供常规和高性能的安装选项;Hackable则支持定制化安装。不同系统(macOS、Windows)和终端(PowerShell、CMD)的操作步骤各有特点,用户需根据自身技术背景选择合适的安装方式。官方推荐使用闲置计算资源或云部署方案以获得更佳体验。

涛涛讲AI 1401

Postgresql下regclass的意义

首先要理解: regclass是oid的别名,postgresql自动的为每一个系统表都建立了一个OId,其中有一个系统表叫做:pg_class,这个表里记录了数据表、索引(仍然需要参阅pg_index)、序列、视图、复合类型和一些特殊关系类型的元数据。注意:不是所有字段对所有对象类型都有意义。官方的解释如下:  来看一个例子:  SELECT * FROM pg_attribute WHER

乔志勇笔记 2405

VINS-Fusion实战:从零搭建无人机视觉SLAM系统(附ROS配置全流程)

本文详细介绍了如何从零开始为无人机搭建基于VINS-Fusion的视觉SLAM系统。内容涵盖硬件选型(重点推荐双目相机与IMU搭配)、ROS环境配置、传感器标定、核心参数调优以及实际飞行测试与问题排解全流程,旨在帮助开发者实现稳定、精确的无人机自主定位与导航。

wasm7browser的博客 215

进阶数据库系列(一):PostgreSQL 基础入门与安装

点击下方名片,设为星标!回复“1024”获取2TB学习资源!大家好,我是民工哥!前面我们陆续卷完了:MySQL、Redis、MongoDB、ElasticSearch、大数据 Hadoop 构架等方面的知识体系的学习。过去几年,MySQL 一直霸占着数据库流行榜的榜首。但是,随着时间的推移,PostgreSQL 以 46.5% 的使用率第一次超过 MySQL 位居第一,而 MySQL 以 45.7...

民工哥的博客 1476

窥秘Windows 10:SAM密码破解

Windows 10作为广受欢迎的操作系统,拥有一套强大的安全措施来保护用户账号和数据安全。然而,有时候我们需要了解更多关于密码破解的知识,以加强我们的防护措施。本文将深入探讨如何突破Windows 10的SAM密码,以便更好地了解密码安全性并加强系统的保护。

Sgirll的博客 6845

人工势场法在自动驾驶避障中的实践与优化

本文深入探讨了人工势场法在自动驾驶避障中的核心原理与实践优化。通过解析引力与斥力模型,揭示了经典算法在局部最优和目标不可达等问题上的局限性,并重点介绍了改进斥力场函数、引入道路边界斥力及动态参数调整等关键优化策略,有效提升了该局部路径规划算法在复杂动态场景下的实用性与鲁棒性。

weixin_29208327的博客 927

PostgreSQL中的依赖类型

PostgreSQL中的依赖类型 pg_depend postgres=# \d+ pg_depend Table &quot;pg_catalog.pg_depend&quot; Column | Type | Modifiers | Storage | Stats target | Description -------------+-...

constzl的博客 2449

【S32K3 MCAL配置】-1.1-GPIO配置及其应用-DIO之高低电平输出-点亮LED灯(基于MCAL)

【S32K3 MCAL配置】-1.1-GPIO配置及其应用-点亮LED灯(基于MCAL)

「汽车电子助手」的博客 1937

pg ::regclass的妙用

regclass是一种数据类型,它实际上是oid的别名。相当于是oid和对象名之间的双向符号,既可以把oid翻译成表名,也可以把表名翻译成oid。通过使用::regclass, 我们就不需要通过查询pg_class表来获取对象与oid的对应关系了。在pg 逻辑复制中,订阅端如果需要看到订阅了哪些表,就可以借助regclass类型来帮助阅读。关于regclass。

冠杰的IT新记录 427

PyTorch深度学习实战(29)——变分自编码器(Variational Autoencoder, VAE)

变分自编码器 (Variational Autoencoder, VAE) 是一种结合了自编码器和概率建模的生成模型,通过编码器将输入数据映射到潜在空间中的概率分布,并通过解码器将从潜在空间采样得到的潜在变量映射回原始数据空间,实现了数据的生成和特征学习。

盼小辉丶的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IDEA 新建springboot项目

1.new project 然后一直 Next,自行命名配置。。。。 创建之后的文件目录 写一个简单的接口 浏览器访问成功!       另附pom.xml配置 &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;...

Dalon_G的博客 762

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

postgresql 12 安装

​#listen_addresses = '*' 表示监听所有的ip信息(记得去掉#)需要修改 配置文件 postgresql.conf 和 pg_hba.conf。#​port = 5432 表示服务的端口,可以自定义为其他端口(记得去掉#)注意 pgsql.sh 文件如果不存在,新建即可。至此单节点PG配置完成。

weixin_68243500的博客 2398

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

查看Oracle、MySQL、PostGreSQL中的依赖关系

在有些程序员开发习惯中,喜欢为了应用代码的简洁或复用,而在数据库创建一个复杂关连查询的VIEW,甚至是VIEW套VIEW嵌套使用, 这里就有个问题如果上线后如发现依赖的表字段类型或长度不足时,修复一个view依赖的table列时发现在oracle、mysql、postgresql(本篇等同pg)中有不同的表现, 尤其是使用postgresql的用户需要格外注意, 因为pg 不允许直接修改, 学术派的严谨, 子之琼浆,彼之砒霜. 喜忧参半。

weixin_tank88921的博客 1270

PostgreSQL每日一贴-数据库对象依赖关系

数据库的对象(用户,模式,表,视图,索引,类型等)之间只有依赖关系的,比如某些表示属于某个用户的,索引是在某个表上等。Postgresql的对象依赖关系记录在pg_depend表中 表定义 postgres=# \d pg_depend    Table "pg_catalog.pg_depend"    Column    |  Type   | Modifiers  --------

失语者的专栏 2937

SQL Sever 创建与管理数据表

数据表是数据库中组织和管理数据的基本单位,数据库的数据保存在表中,数据库的管理与开发都依赖于数据表。数据表是一个由行和列构成的二维结构,其中一行被称为一条记录,一列被称为一个字段。

m0_70214054的博客 4882
上一篇: 程序人生 | C 语言编译器对内存空间的分配原则
下一篇: 特性分析 | PostgreSQL Primary/Standby 主备流复制机制
dbkernel
博客等级 码龄4年 60粉丝 42原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值