对象标识符类型 ================= .. container:: sect1 :name: DATATYPE-OID .. container:: titlepage .. container:: .. container:: .. rubric:: 对象标识符类型 :name: 对象标识符类型 :class: title 对象标识符(OID)被PostgreSQL用来在内部作为多个系统表的主键。 类型\ ``oid``\ 表示一个对象标识符。 也有多个\ ``oid``\ 的别名类型:\ ``regproc``,\ ``regprocedure``, ``regoper``, ``regoperator``,\ ``regclass``, ``regtype``, ``regrole``,\ ``regnamespace``, ``regconfig``, 和\ ``regdictionary``\ 。 `表 对象标识符类型 `__\ 显示了一个概览。 ``oid``\ 类型目前被实现为一个无符号4字节整数。 因此,在大型数据库中它并不足以提供数据库范围内的唯一性,甚至在一些大型的表中也无法提供表范围内的唯一性。 ``oid``\ 类型本身除了比较之外只有很少的操作。不过,它可以被造型成整数,并且接着可以使用标准的整数操作符进行操纵(这样做时要注意有符号和无符号之间可能出现的混乱)。 OID的别名类型除了特定的输入和输出例程之外没有别的操作。这些例程可以接受并显示系统对象的符号名,而不是类型\ ``oid``\ 使用的原始数字值。别名类型使查找对象的OID值变得简单。例如,要检查与一个表\ ``mytable``\ 有关的\ ``pg_attribute``\ 行,你可以写: .. code:: programlisting SELECT * FROM pg_attribute WHERE attrelid = 'mytable'::regclass; 而不是: .. code:: programlisting SELECT * FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'mytable'); 虽然从它本身看起来并没有那么糟,它仍然被过度简化了。如果有多个名为\ ``mytable``\ 的表存在于不同的模式中,就可能需要一个更复杂的子选择来选择右边的OID。\ ``regclass``\ 输入转换器会根据模式路径设置处理表查找,并且因此它会自动地完成这种“右边的事情”。类似地,对于一个数字OID的符号化显示可以很方便地通过将表OID造型成\ ``regclass``\ 来实现。 .. container:: table :name: DATATYPE-OID-TABLE **表 对象标识符类型** .. container:: table-contents +-------------------+-----------------+---------------------+-----------------------+ | 名字 | 引用 | 描述 | 值示例 | +===================+=================+=====================+=======================+ | ``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`` | +-------------------+-----------------+---------------------+-----------------------+ | ``regrole`` | ``pg_authid`` | 角色名 | ``smithee`` | +-------------------+-----------------+---------------------+-----------------------+ | ``regnamespace`` | ``pg_namespace``| 名字空间名称 | ``pg_catalog`` | +-------------------+-----------------+---------------------+-----------------------+ | ``regconfig`` | ``pg_ts_config``| 文本搜索配置 | ``english`` | +-------------------+-----------------+---------------------+-----------------------+ | ``regdictionary`` | ``pg_ts_dict`` | 文本搜索字典 | ``simple`` | +-------------------+-----------------+---------------------+-----------------------+ 所有用于由名字空间组织的对象的 OID 别名类型都接受模式限定的名字,如果没有被限定的对象在当前搜索路径中无法找到时,将会在输出时显示模式限定的名字。\ ``regproc``\ 和\ ``regoper``\ 别名类型将只接受唯一的(非重载的)输入名字,因此它们的使用是受限的;对于大多数使用,\ ``regprocedure``\ 或\ ``regoperator``\ 更合适。对于\ ``regoperator``\ ,通过使用\ ``NONE``\ 来替代未使用的操作数可以标识一元操作符。 大部分 OID 别名类型的一个附加性质是依赖性的创建。如果这些类型之一的一个常量出现在一个存储的表达式(如一个列默认值表达式或视图)中,它会在被引用的对象上创建一个依赖。例如,如果一个列有一个默认值表达式\ ``nextval('my_seq'::regclass)``\ ,OushuDB 会理解该默认值表达式是依赖于序列\ ``my_seq``\ 的,在删除该默认值表达式之前系统将不允许删除该序列。\ ``regrole``\ 是这个性质的唯一例外。这种类型的常量不允许出现在这类表达式中。 .. note:: .. rubric:: 注意 :name: 注意 :class: title OID 别名类型不完全遵循事务隔离规则。规划器也把它们当做简单常量, 这可能会导致次优的规划。 另一种系统中使用的标识符类型是\ ``xid``\ ,或者称为事务(简写为xact)标识符。这是系统列\ ``xmin``\ 和\ ``xmax``\ 使用的数据类型。事务标识符是32位量。 系统使用的第三种标识符类型是\ ``cid``\ ,或者称为命令标识符。这是系统列\ ``cmin``\ 和\ ``cmax``\ 使用的数据类型。命令标识符也是32位量。 系统使用的最后一种标识符类型是\ ``tid``\ ,或者称为元组标识符(行标识符)。这是系统列\ ``ctid``\ 使用的数据类型。一个元组ID是一个(块号,块内元组索引)对,它标识了行在它的表中的物理位置。 (这些系统列在\ `系统列 `__\ 中有进一步的解释)。