↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3
历史版本PostgreSQL 10 已于 2022 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

8.18. 对象标识符类型 #

对象标识符(OID)在 PostgreSQL 内部被用作若干系统表的主键。除非建表时指定 WITH OIDS,或启用配置变量 default_with_oids,否则不会向用户创建的表添加 OID。类型 oid 表示一个对象标识符。还有若干 oid 的别名类型:regproc、regprocedure、regoper、regoperator、regclass、regtype、regrole、regnamespace、regconfig 和 regdictionary。表 8.24 给出了概要说明。

oid 类型目前实现为无符号 4 字节整数。因此,在大型数据库中,它不足以提供数据库范围内的唯一性,甚至在大型的单个表中也无法保证唯一性。因此,不推荐把用户创建表的 OID 列用作主键。OID 最好仅用于引用系统表。

oid 类型本身除比较之外几乎没有其他操作。不过,它可以转换为整数,然后再用标准整数操作符进行处理。(这样做时要注意有符号与无符号可能造成的混淆。)

OID 别名类型除了专门的输入和输出例程外,没有自己的操作。这些例程能够接受并显示系统对象的符号名称,而不是 oid 类型所使用的原始数值。别名类型简化了对象 OID 值的查找。例如,要查看与表 mytable 相关的 pg_attribute 行,可以写成:

SELECT * FROM pg_attribute WHERE attrelid = 'mytable'::regclass;

而不是:

SELECT * FROM pg_attribute
  WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'mytable');

虽然这样看起来也不算太糟,但其实仍然过于简化。如果不同模式中有多个名为 mytable 的表,就必须写一个复杂得多的子查询来选出正确的 OID。regclass 的输入转换器会按照模式路径设置来处理表查找,因此能够自动完成“正确的事情”。同样,把表的 OID 转换成 regclass,也很适合用来以符号形式显示数值 OID。

表 8.24. 对象标识符类型

名字 引用 描述 值示例
oid 任意 数字形式的对象标识符 564182
regproc pg_proc 函数名称 sum
regprocedure pg_proc 带参数类型的函数 sum(int4)
regoper pg_operator 操作符名称 +
regoperator pg_operator 带参数类型的操作符 *(integer,integer) 或-(NONE,integer)
regclass pg_class 关系名称 pg_type
regtype pg_type 数据类型名称 integer
regrole pg_authid 角色名 smithee
regnamespace pg_namespace 命名空间名称 pg_catalog
regconfig pg_ts_config 文本检索配置 english
regdictionary pg_ts_dict 文本检索词典 simple

对于按命名空间分组的对象,所有 OID 别名类型都接受模式限定名称;如果不加限定就无法在当前搜索路径中找到对象,输出时也会显示模式限定名称。regproc 和 regoper 别名类型只接受唯一的(未重载的)输入名称,因此用途有限;对于大多数用途,regprocedure 或 regoperator 更合适。对于 regoperator,通过将未使用的操作数写为 NONE 来标识一元操作符。

大多数 OID 别名类型还有一个附加特性,就是会创建依赖关系。如果这些类型的常量出现在存储的表达式中(例如列默认表达式或视图),它就会对被引用对象建立依赖。例如,如果某列的默认表达式是 nextval('my_seq'::regclass),PostgreSQL 就会知道该默认表达式依赖于序列 my_seq,因此系统不允许在尚未移除该默认表达式时删除序列。(regrole 是这一特性的唯一例外:该类型的常量不允许出现在存储表达式中。)

注意

OID 别名类型并不完全遵循事务隔离规则。规划器也会把它们视为简单常量,这可能导致次优的规划。

系统使用的另一种标识符类型是 xid,即事务(缩写为 xact)标识符。这是系统列 xmin 和 xmax 的数据类型。事务标识符是 32 位的量。

系统使用的第三种标识符类型是 cid,也就是命令标识符。这是系统列 cmin 和 cmax 的数据类型。命令标识符同样是 32 位量。

系统使用的最后一种标识符类型是 tid,也就是元组标识符(行标识符)。这是系统列 ctid 的数据类型。一个元组 ID 是一对值(块号、块内元组索引),用来标识该行在其所属表中的物理位置。

(系统列的更多说明见第 5.4 节。)

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。