Postgresql 中文操作指南

5.5. System Columns #

每个表都有多个由系统隐式定义的_system columns_。因此,这些名称不可用作用户定义列的名称。(请注意,这些限制与该名称是否是关键字无关;对名称加引号不会让你绕开这些限制。)你不用真正关注这些列,只需知道它们的存在即可。

  • tableoid #

    • 包含此行的表的 OID。此列对于从分区表(见 Section 5.11 )或继承层次结构(见 Section 5.10 )中查询的非常方便,因为没有它,从哪个独立表中获得一行就会非常困难。 tableoid 可以与 oidpg_class 列联接以获取表名。

  • xmin #

    • 插入此行版本的插入事务的名称(事务ID)。(一个行版本是一个行的各个状态;每次更新一行都会为同一个逻辑行创建一个新的行版本。)

  • cmin #

    • 插入事务中的命令标识符(从0开始)。

  • xmax #

    • 删除事务的身份(事务 ID),对于一个未被删除的行版本,则为 0。这个列在可见行版本中有可能不为 0。这通常表明删除事务还没有提交,或者删除尝试已回滚。

  • cmax #

    • 删除事务中的命令标识符,或者如果行未被删除,则为0。

  • ctid #

    • 行版本在其表内的物理位置。请注意,虽然 ctid 可以被用来非常快速地定位行版本,但是如果它被更新或被 VACUUM FULL 移动,行的 ctid 会改变。因此, ctid 没用作长期行标识符。应该用主键来标识逻辑行。

事务标识符也是 32 位量。在长期存在的数据库中,事务 ID 可能会环绕。如果采用适当的维护程序,这不是一个致命的问题;有关详细内容,请参见 Chapter 25。但是,不应长期(超过十亿个事务)依赖事务 ID 的唯一性。

命令标识符也是32位量。这在单个事务中生成了232(40亿)个SQL命令的硬性上限。实际上,这个上限并不是问题——请注意,这个上限针对的是SQL命令数量,而不是处理的行数量。此外,只有真正修改数据库内容的命令才会占用命令标识符。