↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3
历史版本。 PostgreSQL 8.0 已结束支持。 请参阅 当前版本手册.

5.4. 系统列 #

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

oid

行的对象标识符(对象 ID)。这是PostgreSQL自动为所有表行添加的一个序列号(除非表是使用WITHOUT OIDS创建的,这种情况下该列不存在)。该列的类型是oid(与列同名);关于该类型的更多信息,参见第 8.12 节。

tableoid

包含该行的表的 OID。该列对于从继承层次中进行选择的查询尤其有用,因为没有它,很难区分一行来自哪个具体的表。tableoid可以与pg_class的oid列连接,以取得表名。

xmin

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

cmin

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

xmax

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

cmax

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

ctid

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

OID 是 32 位的量,由整个集簇共用的单个计数器分配。在大型或长期运行的数据库中,该计数器可能发生回卷。因此,除非采取了确保唯一性的措施,否则不应假定 OID 唯一。如果需要标识表中的行,强烈建议使用序列生成器。不过,只要采取一些额外的预防措施,也可以使用 OID:

  • 对于使用 OID 标识行的每个表,都应在其 OID 列上创建唯一约束。

  • 绝不能假定 OID 在不同表之间也唯一;如果需要数据库范围的标识符,应将tableoid与行 OID 组合使用。

  • 相关的表应当使用WITH OIDS创建,以确保与PostgreSQL将来版本的向前兼容。目前计划让WITHOUT OIDS成为默认。

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

命令标识符也是 32 位的量。这为单个事务中的SQL命令数设置了一个硬上限:232(40 亿)。在实践中,这个限制并不是问题——注意,这里限制的是SQL命令的数量,而不是处理的行数。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.