在执行一项任务期间,我在 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 是一个元数据表 — 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。