pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
一个列既可以是给定表的一个用户定义列,也可以是下列系统定义列之一:
oid一行的对象标识符(对象 ID)。这是 PostgreSQL 自动为所有表行添加的一个序列号(除非表创建时使用了 WITHOUT OIDS,这种情况下该列不存在)。
tableoid包含该行的表的 OID。对于从继承层次中选择的查询来说,这个属性特别有用,因为没有它就很难分辨一行来自哪个具体的表。tableoid 可以与 pg_class 的 oid 列连接来获得表名。
xmin插入该元组的事务的标识(事务 ID)。(注意:元组是一行的单个状态;对一行的每次更新都会为同一逻辑行创建一个新元组。)
cmin插入事务内部的命令标识符(从零开始)。
xmax删除事务的标识(事务 ID),对于未删除的元组为零。在一个可见元组中该字段也可能非零:这通常表示删除事务尚未提交,或者一次尝试的删除已被回滚。
cmax删除事务内部的命令标识符,或为零。
ctid该元组在其表中的元组 ID。这是一对(块号,块内元组索引),标识该元组的物理位置。注意,虽然 ctid 可以用来非常快速地定位元组,但一行的 ctid 在每次被更新或被 VACUUM FULL 移动时都会改变。因此 ctid 作为长期行标识符是没有用的。应该使用 OID,或者更好的是用户定义的序列号来标识逻辑行。
OID 是 32 位的量,从一个集群范围的计数器分配。在一个大的或长期运行的数据库中,该计数器有可能回绕。因此,除非你采取措施确保 OID 唯一,否则假设 OID 唯一是不好的做法。使用 OID 进行行标识时的推荐做法是,为每个将使用 OID 的表在 OID 列上创建一个唯一约束。绝不要假设 OID 跨表唯一;如果需要一个数据库范围的标识符,请使用 tableoid 与行 OID 的组合。(PostgreSQL 的未来版本很可能为每个表使用单独的 OID 计数器,因此 tableoid 必须被包括进来才能得到全局唯一的标识符。)
事务标识符是 32 位的量。在一个长期运行的数据库中,事务 ID 有可能回绕。在有适当维护过程的情况下这并不是致命问题;详见管理员指南。然而,依赖事务 ID 在长期(超过十亿个事务)内的唯一性是不明智的。
命令标识符也是 32 位的量。这带来一个单个事务内 232(40 亿)条 SQL 命令的硬限制。实践中这个限制不成问题——注意该限制针对的是 SQL 查询的数目,而不是处理的元组数目。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。