受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

5.6. 系统列 #

每个表都有几个由系统隐式定义的系统列。因此,这些名称不能用作用户定义列的名称。(注意,这些限制与名称是否为关键字无关;给名称加引号也不能绕过这些限制。)你其实不必关心这些列的细节,只需要知道它们存在即可。

tableoid #

包含该行的表的 OID。对于从分区表(见Section 5.12)或继承层次(见Section 5.11)中查询数据的场景,这一列尤其方便,因为如果没有它,就很难判断一行究竟来自哪个具体表。tableoid可以与pg_classoid列连接,以取得表名。

xmin #

插入该行版本的事务标识(事务 ID)。(行版本是某一行的一个具体状态;对同一逻辑行的每次更新都会创建一个新的行版本。)

cmin #

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

xmax #

删除事务的标识(事务 ID);对于未删除的行版本则为 0。对于一个可见的行版本,该列也可能是非零值。这通常表示删除事务尚未提交,或者一次删除尝试被回滚了。

cmax #

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

ctid #

行版本在其表中的物理位置。注意尽管ctid可以被用来非常快速地定位行版本,但是一个行的ctid会在被更新或者被VACUUM FULL移动时改变。因此,不应将ctid用作行标识符。应使用主键来标识逻辑行。

事务标识符也是 32 位的量。在一个长期运行的数据库中,事务 ID 可能会回卷。只要采取适当的维护措施,这并不是致命问题,详见Chapter 24。不过,从长期来看(超过十亿个事务)依赖事务 ID 的唯一性是不明智的。

命令标识符也是 32 位的量。这为单个事务中的SQL命令数设置了一个硬上限: 232(40 亿)。在实践中,这个限制并不是问题 — 注意,这里限制的是SQL命令的数量,而不是处理的行数。另外,只有真正修改数据库内容的命令才会消耗命令标识符。

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。