对象标识符(OID)被LightDB用来在内部作为多个系统表的主键。
类型oid
表示一个对象标识符。
也有多个oid
的别名类型分别被命名为reg
。
Table 9.24显示了一个概览。
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
来实现。
Table 9.24. 对象标识符类型
名字 | 引用 | 描述 | 值示例 |
---|---|---|---|
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别名类型都接受模式限定名称,如果在当前搜索路径中找不到未经限定的对象,则将在输出中显示模式限定名称。例如,myschema.mytable
是regclass
的可接受输入(如果存在这样的表)。该值可能输出为myschema.mytable
,或仅为mytable
,具体取决于当前搜索路径。regproc
和regoper
别名类型将只接受唯一(未重载)的输入名称,因此它们的用途有限;对于大多数用途,regprocedure
或regoperator
更合适。对于regoperator
,通过为未使用的操作数写入NONE
来标识一元操作符。
大多数OID别名类型的另一个特性是创建依赖项。如果这些类型中的一个常量出现在存储的表达式(如一个列的默认表达式或视图)中,它将创建对引用对象的依赖关系。例如,如果列具有默认表达式nextval('my_seq'::regclass)
,LightDB知道默认表达式取决于序列my_seq
,因此系统只允许在首先删除默认表达式的情况下才能删除序列。nextval('my_seq'::text)
的替代方法不会创建依赖项。(regrole
是此属性的例外。存储表达式中不允许使用此类型的常量。)
OID别名类型并不完全遵循事务隔离规则。规划者还将它们视为简单的常数,这可能会导致次优规划。
另一种系统中使用的标识符类型是xid
,或者称为事务(简写为xact)标识符。
这是系统列xmin
和xmax
使用的数据类型。事务标识符是32位量。
在某种情况下,使用64位变量xid8
。
不像xid
值,xid8
值严格单调地增加,并且不能在数据库集群的生命周期中重用。
系统使用的第三种标识符类型是cid
,或者称为命令标识符。这是系统列cmin
和cmax
使用的数据类型。命令标识符也是32位量。
系统使用的最后一种标识符类型是tid
,或者称为元组标识符(行标识符)。这是系统列ctid
使用的数据类型。一个元组ID是一个(块号,块内元组索引)对,它标识了行在它的表中的物理位置。
(这些系统列在Section 6.5中有进一步的解释)。