↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 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 7.4 已于 2010 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

5.2. 系统列 #

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

oid

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

tableoid

包含该行的表的 OID。这个列对于从继承 层次中选择的查询特别有用,因为如果没有它,很难判断一行 来自哪个具体的表。可以把 tableoid 与 pg_class 的 oid 列连接来获得表名。

xmin

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

cmin

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

xmax

删除事务的标识(事务 ID),对未删除的行版本为零。 在可见的行版本中这个列也可能 非零:这通常表示删除事务 尚未提交,或者一次删除尝试 已被回滚。

cmax

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

ctid

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

OID 是 32 位的量,从一个集群范围内的单一 计数器分配。在一个大的或长期使用的数据库中,该 计数器有可能回绕。因此,除非采取措施确保 OID 唯一,否则假定 OID 唯一是不好的做法。 在用 OID 做行标识时,推荐的做法是为每个要使用 OID 的表 在其 OID 列上创建唯一约束。绝不要假定 OID 在表之间唯一;如果需要数据库范围的标识符, 请使用 tableoid 与行 OID 的 组合。(PostgreSQL 的未来版本可能为每个表使用单独的 OID 计数器,因此要得到全局唯一的标识符 必须包含 tableoid。)

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

命令 标识符也是 32 位的量。这对单个事务内的 SQL 命令数造成了 232 (40 亿)的硬限制。实践中这个限制不是 问题——注意该限制针对的是 SQL 命令的数量,而不是处理的行数。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。