On this page
8.19. 对象标识符类型
PostgreSQL 内部使用对象标识符(OID)作为各种系统表的主键。除非在创建表时指定WITH OIDS
或启用default_with_oids配置变量,否则 OID 不会添加到用户创建的表中。类型oid
表示对象标识符。 oid
还有几种别名类型:regproc
,regprocedure
,regoper
,regoperator
,regclass
,regtype
,regrole
,regnamespace
,regconfig
和regdictionary
。 Table 8.24显示了概述。
oid
类型当前实现为无符号的四字节整数。因此,它不足以在大型数据库甚至大型单个表中提供数据库范围的唯一性。因此,不建议将用户创建的表的 OID 列用作主键。 OID 最好仅用于引用系统表。
oid
类型本身只有很少的操作无法比较。但是,可以将其强制转换为整数,然后使用标准整数运算符对其进行操作。 (如果要这样做,请当心可能的签名与未签名的混淆.)
除了专门的 Importing 和输出例程,OID 别名类型没有自己的操作。这些例程能够接受和显示系统对象的符号名称,而不是类型oid
会使用的原始数字值。别名类型允许简化对象的 OID 值查找。例如,要检查与表mytable
相关的pg_attribute
行,可以这样写:
SELECT * FROM pg_attribute WHERE attrelid = 'mytable'::regclass;
rather than:
SELECT * FROM pg_attribute
WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'mytable');
虽然这看上去并不很糟糕,但仍然过于简化了。如果在不同模式中有多个名为mytable
的表,则需要更复杂的子选择来选择正确的 OID。 regclass
Importing 转换器根据架构路径设置处理表查找,因此它会自动执行“正确的事情”。同样,将表的 OID 强制转换为regclass
可以方便地显示数字 OID。
表 8.24. 对象标识符类型
Name | References | Description | Value Example |
---|---|---|---|
oid |
any | 数字对象标识符 | 564182 |
regproc |
pg_proc |
function name | sum |
regprocedure |
pg_proc |
具有参数类型的功能 | sum(int4) |
regoper |
pg_operator |
operator name | + |
regoperator |
pg_operator |
具有参数类型的运算符 | *(integer,integer) 或-(NONE,integer) |
regclass |
pg_class |
relation name | pg_type |
regtype |
pg_type |
数据类型名称 | integer |
regrole |
pg_authid |
role name | smithee |
regnamespace |
pg_namespace |
namespace name | pg_catalog |
regconfig |
pg_ts_config |
Literals 搜索配置 | english |
regdictionary |
pg_ts_dict |
Literals 搜索字典 | simple |
按名称空间分组的对象的所有 OID 别名类型都接受模式限定的名称,如果在当前搜索路径中没有限定对象的情况下找不到对象,则将在输出中显示模式限定的名称。 regproc
和regoper
别名类型将仅接受唯一的 Importing 名称(不会重载),因此它们的使用受到限制;对于大多数用途,regprocedure
或regoperator
更合适。对于regoperator
,通过为未使用的操作数写入NONE
来识别一元运算符。
大多数 OID 别名类型的另一个属性是依赖关系的创建。如果这些类型之一的常量出现在存储的表达式(例如列默认表达式或视图)中,则它将创建对引用对象的依赖关系。例如,如果一列具有默认表达式nextval('my_seq'::regclass)
,则 PostgreSQL 理解默认表达式取决于序列my_seq
;在不先删除默认表达式的情况下,系统不会丢弃该序列。 regrole
是该属性的唯一 exception。在此类表达式中不允许使用此类常量。
Note
OID 别名类型不完全遵循事务隔离规则。计划者还将它们视为简单常数,这可能会导致次优计划。
系统使用的另一种标识符类型是xid
或事务(缩写为 xact)标识符。这是系统列xmin
和xmax
的数据类型。事务标识符是 32 位的数量。
系统使用的第三种标识符类型是cid
,即命令标识符。这是系统列cmin
和cmax
的数据类型。命令标识符也是 32 位量。
系统使用的最终标识符类型是tid
或 Tuples 标识符(行标识符)。这是系统列ctid
的数据类型。TuplesID 是一对(块号,块内的 Tuples 索引),用于标识表中行的物理位置。
(系统列在Section 5.4中进一步说明。)