Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

5.6. 系统列 #

每个表都有若干个由系统隐式定义的系统列。因此,不能将这些名称用作用户自定义列的名称。(注意,这些限制与名称是否为关键字无关;引用名称并不能豁免这些限制。)事实上并不需要关注这些列;只需知道它们的存在即可。

tableoid #

包含此行的表的 OID。对于从已分区的表(参见第 5.12 节)或继承层次结构(参见第 5.11 节)中选择的查询,此列特别实用,因为如果不使用此列,则很难判断一行来自哪个特定表。tableoid 可以与 pg_classoid 列进行联接,以获得表名。

xmin #

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

cmin #

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

xmax #

删除事务的身份(事务 ID),对于未删除的行版本则为零。此列在可见行版本中也可能为非零。这通常表示删除事务尚未提交,或者删除尝试已回滚。

cmax #

删除事务中的命令标识符,或为零。

ctid #

行版本在其表中的物理位置。请注意,虽然可以使用 ctid 非常快速地找到行版本,但如果行版本由 VACUUM FULL 更新或移动,则其 ctid 会发生更改。因此,ctid 作为长期行标识符毫无用处。应使用主键来标识逻辑行。

事务标识符也是 32 位量。在长期数据库中,事务标识符可能会环绕。这是不是致命问题,只要有适当的维护程序即可;有关详细信息,请参见第 24 章。不过,长期(超过十亿个事务)依赖事务标识符的唯一性是不明智的。

命令标识符也是 32 位量。这创建了 232(40 亿)的硬限制SQL单事务中的命令。实际上,此限制不是问题 - 请注意,限制在于SQL命令数,而不是处理的行数。而且,只有实际修改数据库内容的命令才会消耗命令标识符。