对象标识符类型

本文介绍了对象标识符类型的定义及相关语法。

对象标识符(OID)被本数据库用来在内部作为多个系统表的主键。 类型oid表示一个对象标识符。 也有多个oid的别名类型命名为reg``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 的符号化显示可以很方便地通过将表 OID 造型成regclass来实现。

对象标识符类型

名字

引用

描述

值示例

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) or -(NONE,​integer)

regproc

pg_proc

函数名字

sum

regprocedure

pg_proc

函数与参数类型

sum(int4)

regrole

pg_authid

角色名

smithee

regtype

pg_type

数据类型名称

integer

所有用于由名字空间组织的对象的 OID 别名类型都接受模式限定的名字,如果没有被限定的对象在当前搜索路径中无法找到时,将会在输出时显示模式限定的名字。regprocregoper别名类型将只接受唯一的(非重载的)输入名字,因此它们的使用是受限的;对于大多数使用,regprocedureregoperator更合适。对于regoperator,通过使用NONE来替代未使用的操作数可以标识一元操作符。

大部分 OID 别名类型的一个附加性质是依赖性的创建。如果这些类型之一的一个常量出现在一个存储的表达式(如一个列默认值表达式或视图)中,它会在被引用的对象上创建一个依赖。例如,如果一个列有一个默认值表达式nextval('my_seq'::regclass),本数据库会理解该默认值表达式是依赖于序列my_seq的,在删除该默认值表达式之前系统将不允许删除该序列。regrole是这个性质的唯一例外。这种类型的常量不允许出现在这类表达式中。

重要

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

另一种系统中使用的标识符类型是xid,或者称为事务(简写为 xact)标识符。 这是系统列xminxmax使用的数据类型。事务标识符是 32 位量。 在某种情况下,使用 64 位变量xid8。 不像xid值,xid8值严格单调地增加,并且不能在数据库集群的生命周期中重用。

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

系统使用的最后一种标识符类型是tid,或者称为元组标识符(行标识符)。这是系统列ctid使用的数据类型。一个元组 ID 是一个(块号,块内元组索引)对,它标识了行在它的表中的物理位置。