8.19. 对象标识符类型

PostgreSQL 内部使用对象标识符(OID)作为各种系统表的主键。除非在创建表时指定WITH OIDS或启用default_with_oids配置变量,否则 OID 不会添加到用户创建的表中。类型oid表示对象标识符。 oid还有几种别名类型:regprocregprocedureregoperregoperatorregclassregtyperegroleregnamespaceregconfigregdictionaryTable 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。 regclassImporting 转换器根据架构路径设置处理表查找,因此它会自动执行“正确的事情”。同样,将表的 OID 强制转换为regclass可以方便地显示数字 OID。

表 8.24. 对象标识符类型

NameReferencesDescriptionValue Example
oidany数字对象标识符564182
regprocpg_procfunction namesum
regprocedurepg_proc具有参数类型的功能sum(int4)
regoperpg_operatoroperator name+
regoperatorpg_operator具有参数类型的运算符*(integer,integer)-(NONE,integer)
regclasspg_classrelation namepg_type
regtypepg_type数据类型名称integer
regrolepg_authidrole namesmithee
regnamespacepg_namespacenamespace namepg_catalog
regconfigpg_ts_configLiterals 搜索配置english
regdictionarypg_ts_dictLiterals 搜索字典simple

按名称空间分组的对象的所有 OID 别名类型都接受模式限定的名称,如果在当前搜索路径中没有限定对象的情况下找不到对象,则将在输出中显示模式限定的名称。 regprocregoper别名类型将仅接受唯一的 Importing 名称(不会重载),因此它们的使用受到限制;对于大多数用途,regprocedureregoperator更合适。对于regoperator,通过为未使用的操作数写入NONE来识别一元运算符。

大多数 OID 别名类型的另一个属性是依赖关系的创建。如果这些类型之一的常量出现在存储的表达式(例如列默认表达式或视图)中,则它将创建对引用对象的依赖关系。例如,如果一列具有默认表达式nextval('my_seq'::regclass),则 PostgreSQL 理解默认表达式取决于序列my_seq;在不先删除默认表达式的情况下,系统不会丢弃该序列。 regrole是该属性的唯一 exception。在此类表达式中不允许使用此类常量。

Note

OID 别名类型不完全遵循事务隔离规则。计划者还将它们视为简单常数,这可能会导致次优计划。

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

系统使用的第三种标识符类型是cid,即命令标识符。这是系统列cmincmax的数据类型。命令标识符也是 32 位量。

系统使用的最终标识符类型是tid或 Tuples 标识符(行标识符)。这是系统列ctid的数据类型。TuplesID 是一对(块号,块内的 Tuples 索引),用于标识表中行的物理位置。

(系统列在Section 5.4中进一步说明。)