PostgreSQL中系统目录的OID是什么:pg_depend中的列classid

问题描述 投票:0回答:1

在执行一项任务期间,我在 pg_depend 表中发现了列 classid。 文档(https://www.postgresql.org/docs/12/catalog-pg-depend.html)说: “classid - 依赖对象所在系统目录的 OID”。 据我所知,在 PostgreSQL 中通常术语“catalog”=“database”;然而,一旦我检查了 pg_database,我就感到惊讶:在我的 PostgreSQL 中,pg_database 中的 oid 只有 4 个值,并且没有一个等于 pg_depend 中的 21 个 classid 值。

有人能澄清一下 pg_depend 中的 classid 是什么以及在这种情况下什么是“系统目录”吗?

postgresql catalog
1个回答
0
投票

“目录”不是数据库。用 PostgreSQL 的说法,catalog 是一个元数据表 — PostgreSQL 存储数据库中有哪些表 (

pg_catalog.pg_class
)、表中有哪些列 (
pg_catalog.pg_attribute
) 等信息的表之一.

每个表(与 PostgreSQL 中的所有其他表一样)都有一个对象 ID,这是一个唯一标识它们的数字,并且即使您重命名表也保持不变。

pg_depend
是跟踪数据库对象之间关系的目录。例如,每个表都取决于表的架构。此信息用于防止用户删除表仍需要的模式。在其他情况下,依赖关系用于在删除对象时自动删除依赖对象(例如,您删除的表的所有约束都会自动消失。

依赖项存储在

pg_depend
中,如下所示:

  • classid
    是包含依赖对象的目录表的对象 ID(对于
    pg_class
    的表,其对象 ID 始终为 1259)
  • objid
    是依赖对象的对象ID(如果
    classid
    是1259,那就是表的对象ID)
  • refclassid
    refobjid
    与上面引用的对象
  • deptype
    是依赖类型

您可能想知道为什么需要

objid
。原因是对象 ID 不是全局唯一的,而是仅在同一类型的对象内唯一。例如,两个表、视图或序列不能具有相同的对象 ID,但函数或数据库可以与表具有相同的对象 ID。

© www.soinside.com 2019 - 2024. All rights reserved.