登录
5.5 系统列#
每个表都有系统隐式定义的几个系统列。因此,这些名称不能用作用户定义列的名称。(请注意,这些限制与名称是否是关键字无关;引用名称不会使你摆脱这些限制。)你实际上不必关心这些列;只要知道它们存在即可。
tableoid
#包含此行的表的 OID。此列对于从分区表(请参阅第 5.11 节)或继承层次结构(请参阅第 5.10 节)中进行选择的查询特别方便,因为如果没有它,就很难判断行来自哪个单独的表。可以将
tableoid
与pg_class
的oid
列联接,以获取表名。xmin
#此行版本的插入事务的身份(事务 ID)。(行版本是行的单个状态;每次更新行都会为同一逻辑行创建新的行版本。)
cmin
#插入事务中的命令标识符(从零开始)。
xmax
#删除事务的身份(事务 ID),或未删除的行版本为零。此列有可能在可见的行版本中不为零。这通常表示删除事务尚未提交,或尝试删除已回滚。
cmax
#删除事务中的命令标识符,或为零。
ctid
#行版本在其表中的物理位置。请注意,虽然
ctid
可用于非常快速地定位行版本,但如果行通过VACUUM FULL
更新或移动,则行的ctid
将更改。因此,ctid
作为长期行标识符是无用的。应使用主键来标识逻辑行。
事务标识符也是 32 位量。在长期存在的数据库中,事务 ID 有可能环绕。如果采用适当的维护程序,这不是一个致命的问题;有关详细信息,请参阅第 25 章。但是,不应长期依赖事务 ID 的唯一性(超过十亿个事务)。
命令标识符也是 32 位量。这会创建 232(40 亿)SQL命令在单个事务中的硬限制。在实践中,此限制不是问题——请注意,限制是SQL命令的数量,而不是处理的行数。此外,只有实际修改数据库内容的命令才会消耗命令标识符。