©
Dieses Dokument verwendet PHP-Handbuch für chinesische Websites Freigeben
PostgreSQL在内部使用对象标识符(OID)作为各种系统表的主键。 同时,系统不会给用户创建的表增加一个 OID 系统字段(除非在建表时声明了WITH OIDS或者配置参数default_with_oids 设置为开启)。oid类型代表一个对象标识符。 除此以外oid还有几个别名:regproc,regprocedure, regoper,regoperator,regclass,regtype, regconfig和regdictionary。 Table 8-23显示了概览。
目前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对应的符号名称的最简单方法。
Table 8-23. 对象标识符类型
名字 | 引用 | 描述 | 数值例子 |
---|---|---|---|
oid | 任意 | 数字化的对象标识符 | 564182 |
regproc | pg_proc | 函数名字 | sum |
regprocedure | pg_proc | 带参数类型的函数 | sum(int4) |
regoper | pg_operator | 操作符名 | + |
regoperator | pg_operator | 带参数类型的操作符 | *(integer,integer) or -(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是一对数值(块号,块内的行索引),它标识该行在其所在表内的物理位置。
系统字段在Section 5.4里有更多解释。