对象标识符类型

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 8. 数据类型 | 下一页

# 8.18. 对象标识符类型

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

目前`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 对应的符号名称的最简单方法。

表 8-24. 对象标识符类型

名字 | 引用 | 描述 | 数值例子
--- | --- | --- | ---
`oid` | 任意 | 数字化的对象标识符 | `564182`
`regproc` | `pg_proc` | 函数名字 | `sum`
`regprocedure` | `pg_proc` | 带参数类型的函数 | `sum(int4)`
`regoper` | `pg_operator` | 操作符名 | `+`
`regoperator` | `pg_operator` | 带参数类型的操作符 | `*(integer,integer)` 或 `-(NONE,integer)`
`regclass` | `pg_class` | 关系名 | `pg_type`
`regtype` | `pg_type` | 数据类型名 | `integer`
`regconfig` | `pg_ts_config` | 文本搜索配置 | `english`
`regdictionary` | `pg_ts_dict` | 文本搜索字典 | `simple`

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

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

系统使用的另外一个标识符类型是事务(缩写xact)标识符`xid`。 它是系统字段`xmin`和`xmax`的数据类型。事务标识符是 32 位的量。

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

系统使用的最后一个标识符类型是行标识符`tid`。 它是系统表字段`ctid`的数据类型。行 ID 是一对数值(块号，块内的行索引)， 它标识该行在其所在表内的物理位置。

系统字段在第 5.4 节里有更多解释。

上一页 | 起始页 | 下一页
范围类型 | 上一级 | pg_lsn 类型