对象标识符(OID)在 PostgreSQL 内部被用作 若干系统表的主键。类型 oid 表示一个对象标识符。 此外还有若干 oid 的别名类型,统称为 reg。 Table 8.26 给出了概要说明。something
oid 类型目前实现为无符号 4 字节整数。因此, 在大型数据库中,它不足以提供数据库范围内的唯一性,甚至在大型的 单个表中也无法保证唯一性。
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。
Table 8.26. 对象标识符类型
| 名字 | 引用 | 描述 | 值示例 |
|---|---|---|---|
oid |
任意 | 数字形式的对象标识符 | 564182 |
regclass |
pg_class |
关系名称 | pg_type |
regcollation |
pg_collation |
排序规则名称 | "POSIX" |
regconfig |
pg_ts_config |
文本搜索配置 | english |
regdictionary |
pg_ts_dict |
文本搜索字典 | simple |
regnamespace |
pg_namespace |
命名空间名称 | pg_catalog |
regoper |
pg_operator |
操作符名称 | + |
regoperator |
pg_operator |
带参数类型的操作符 | *(integer,integer) 或 -(NONE,integer) |
regproc |
pg_proc |
函数名称 | sum |
regprocedure |
pg_proc |
函数与参数类型 | sum(int4) |
regrole |
pg_authid |
角色名 | smithee |
regtype |
pg_type |
数据类型名称 | integer |
对于按名字空间分组的对象,所有 OID 别名类型都接受模式限定名称;如果不加限定就无法在当前搜索路径中找到对象,输出时也会显示模式限定名称。regproc和regoper别名类型只接受唯一的(未重载的)输入名称,因此用途有限;对于大多数用途,regprocedure或regoperator更合适。对于regoperator,通过将未使用的操作数写为NONE来标识一元操作符。
大多数 OID 别名类型还有一个附加特性,就是会创建依赖关系。如果 这些类型的常量出现在存储的表达式中(例如列默认表达式或视图), 它就会对被引用对象建立依赖。例如,如果某列的默认表达式是 nextval('my_seq'::regclass), PostgreSQL 就会知道该默认表达式依赖于 序列 my_seq,因此系统在删除该序列之前,必须先 移除该默认表达式。 (regrole 是这一特性的例外:该类型的常量不允许出现在 存储表达式中。)
OID 别名类型并不完全遵循事务隔离规则。规划器也会把它们视为简单常量,这可能导致次优的规划。
系统使用的另一种标识符类型是 xid,即事务 ID (事务缩写为 xact)。这是系统列 xmin 和 xmax 的数据类型。事务 ID是 32 位量。在某些上下文中会使用 64 位 变体 xid8。与 xid 值不同, xid8 值严格单调递增,并且在数据库集簇的生命周期内 不会被重用。
系统使用的第三种标识符类型是 cid,也就是命令标识符。 这是系统列 cmin 和 cmax 的数据类型。命令标识符同样是 32 位量。
系统使用的最后一种标识符类型是 tid,也就是元组标识符 (行标识符)。这是系统列 ctid 的数据 类型。一个元组 ID 是一对值(块号、块内元组索引),用来标识该行在 其所属表中的物理位置。
(系统列的更多说明见 Section 5.5。)