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

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

已结束支持的版本: 7.2 / 7.1
历史版本。 PostgreSQL 7.2 已结束支持。 请参阅 当前版本手册.

1.2. 列 #

一个列既可以是给定表的一个用户定义列,也可以是下列系统定义列之一:

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 查询的数目,而不是处理的元组数目。

报告文档问题

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