oid 对象表示符

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

.12. 对象标识符类型

PostgreSQL 在内部使用对象标识符(OID)作为各种系统表的主键。同时,系统不会给用户创建的表增加一个OID 系统字段(除非在建表时声明了WITH OIDS 或者是配置参数default_with_oids设置成了真)。类型oid 代表一个对象标识符。除此以外还有几个oid 的别名:regproc,regprocedure,regoper,regoperator,regclass,和regtype。Table 8-19显示了概要。

目前oid 类型是用一个无符号的四字节整数实现的。因此,它是不够用于提供大数据库范围内的唯一性保证的,甚至在单个的大表中也不行。因此,我们不鼓励在用户创建的表中使用OID 字段做主键。OID 最好只是用于引用系统表。

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 的表,那么我们需要写一个更复杂的子查询。regclass 的输入转换器处理根据模式路径设置的表检索工作,所以它自动干了"正确的事情"。类似的还有,把一个表的OID 转换成regclass 是查找一个OID 对应的符号名称的最简单方法。

所有OID 别名类型都接受有模式修饰的名字,并且如果在当前搜索路径中,在不增加修饰的情况下无法找到该对象,那么在输出时将显示有模式修饰的名字。regproc 和regoper 别名类型将只接受唯一的输入名字(不能重载),因此它们的用途有限;对于大多数应用,regprocedure 或regoperat或者更合适。对于regoperat或者,单目操作符是通过在那些未用的操作数上写NONE来标识的。

OID 别名类型的一个额外的属性是如果这些类型之一的常量出现在一个存储的表达式里(比如字段缺省表达式或者试图),它在被引用的对象上创建一个依赖性。比如,如果一个字段有缺省的nextval('my_seq'::regclass) 表达式,PostgreSQL 理解缺省表达式依赖于序列my_seq;系统将不允许在删除缺省的表达式之前删除该序列。

系统使用的另外一个标识符类型是xid,或者说是事务(缩写xact) 标识符。它是系统字段

xmin 和xmax 的数据类型。事务标识符是32 位的量。

系统需要的第三种标识符类型是cid,或者命令标识符。它是系统字段cmin 和cmax 的数据类型。命令标识符也是32 位的量。

系统使用的最后的标识符类型是tid,或者说是元组标识符。它是系统表字段ctid 的数据类型。元组ID 是一对儿数值(块号,块内的元组索引),它标识该元组在其所在表内的物理位置。

(系统字段在Section 5.4里有更多解释。)

相关文档
最新文档