对象标识符类型
对象标识符类型#
OushuDB 在内部使用对象标识符(OID)作为各种系统表的主键。同时,系统不会给用户创建的表增加一个 OID 系统字段(除非在建表时声明了WITH OIDS 或者配置参数default_with_oids设置为开启)。oid 类型代表一个对象标识符。除此以外oid还有几个别名:regproc, regprocedure, regoper, regoperator, regclass, regtype, regconfig, 和regdictionary(见下表)。
备注
ORC/Hudi/MAGMA格式的表不支持使用WITH OIDS声明表。
目前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 |
任意 |
数字化的对象标识符 |
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 |
所有 OID 别名类型都接受有模式修饰的名字, 并且如果在当前搜索路径中不增加修饰无法找到该对象的话, 那么在输出时将显示有模式修饰的名字。regproc和regoper 别名类型将只接受唯一的输入名字(不能重载),因此它们的用途有限。 对于大多数应用,regprocedure或regoperator更合适。 对于regoperator,单目操作符是通过在那些未用的操作数上写NONE 来标识的。
OID 别名类型的一个额外的属性是依赖关系的创建。 如果这些类型之一的常量出现在一个存储的表达式里(比如列缺省表达式或者视图), 它在被引用的对象上创建一个依赖性。比如,如果一个列有缺省的 nextval(‘my_seq’::regclass)表达式,OushuDB 理解缺省表达式依赖于序列my_seq;系统将不允许在删除缺省的表达式之前删除该序列。