PostgreSQL中的Object Identifier(oid)数据类型

PostgreSQL在内部使用对象标识符(OID)作为各种系统表的主键。OID不会添加到用户创建的表中,除非在创建表时指定了WITH OIDS,或者启用了default_with_oids配置变量。类型oid表示对象标识符。oid还有几种别名类型:regproc,regprocedure,regoper,regoperator,regclass,regtype,regrole,regnamespace,regconfig和regdictionary。

oid类型当前的实现为无符号的四字节整数。因此,它不足以在大型数据库或甚至大型单个表中提供数据库范围的唯一性。因此,不鼓励使用用户创建的表的OID列作为主键。OID最好仅用于对系统表的引用。

oid类型本身几乎没有比较的操作。但是,它可以转换为整数,然后使用标准整数运算符进行操作。(如果这样做,请注意可能存在有符号与无符号的混淆。)

除了专门的输入和输出routines之外,OID别名类型没有自己的操作。这些routines能够接受和显示系统对象的符号名称,而不是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的符号显示非常方便。

按namespace分组的对象的所有OID别名类型都接受模式限定名称,并且如果在没有限定的情况下在当前搜索路径中找不到该对象,则将在输出上显示模式限定名称。regproc和regoper别名类型只接受唯一(不过载)的输入名称,因此它们的用途有限;对于大多数用途,regprocedure或regoperator更合适。对于regoperator,通过为未使用的操作数写入NONE来标识一元运算符。

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

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

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

系统使用的第三种标识符类型是cid或命令标识符。这是系统列cmin和cmax的数据类型。命令标识符也是32位长度的。

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

原文地址:https://www.cnblogs.com/abclife/p/11338081.html