pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
对象标识符(OID)在 PostgreSQL 内部被用作各种系统表的主键。此外,用户创建的表也会加上一个 OID 系统列(除非建表时指定了 WITHOUT OIDS)。类型 oid 表示对象标识符。oid 还有几个别名类型:regproc、regprocedure、 regoper、regoperator、regclass 和 regtype。表 8.19 给出了一个概览。
oid 类型目前实现为无符号 4 字节整数。因此, 在大型数据库中,它不足以提供数据库范围内的唯一性,甚至在大型的 单个表中也无法保证唯一性。 因此,不推荐把用户创建表的 OID 列用作主键。OID 最好仅用于引用系统表。
oid 类型本身除比较之外几乎没有其他操作。不过,它可以 转换为整数,然后再用标准整数操作符进行处理。(这样做时要注意 有符号与无符号可能造成的混淆。)
OID 别名类型除了专门的输入和输出例程外没有自己的运算。这些例程能够接受并显示系统对象的符号名称,而不是类型 oid 会使用的原始数值。别名类型可以简化对象 OID 值的查找:例如,可以写 'mytable'::regclass 来获得表 mytable 的 OID,而不必写 SELECT oid FROM pg_class WHERE relname = 'mytable'。(实际上,当不同模式中有多个名为 mytable 的表时,要选出正确的 OID 需要复杂得多的 SELECT。)
表 8.19. 对象标识符类型
| 名字 | 引用 | 描述 | 值示例 |
|---|---|---|---|
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 |
所有 OID 别名类型都接受模式限定名称;如果不加限定就无法在当前搜索路径中找到对象,输出时也会显示模式限定名称。regproc和regoper别名类型只接受唯一的(未重载的)输入名称,因此用途有限;对于大多数用途,regprocedure或regoperator更合适。对于regoperator,通过将未使用的操作数写为NONE来标识一元操作符。
系统使用的另一种标识符类型是xid,即事务(缩写为xact)标识符。这是系统列xmin和xmax的数据类型。事务标识符是 32 位的量。
系统使用的第三种标识符类型是 cid,也就是命令标识符。 这是系统列 cmin 和 cmax 的数据类型。命令标识符同样是 32 位量。
系统使用的最后一种标识符类型是 tid,也就是元组标识符 (行标识符)。这是系统列 ctid 的数据 类型。一个元组 ID 是一对值(块号、块内元组索引),用来标识该行在 其所属表中的物理位置。
(系统列的更多说明见 第 5.2 节。)
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。