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