pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
每个表都有几个由系统隐式定义的系统列。因此,这些名称不能用作用户定义列的名称。(注意,这些限制与名称是否为关键字无关;给名称加引号也不能绕过这些限制。)你其实不必关心这些列的细节,只需要知道它们存在即可。
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 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。