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