系统列 =========== 每一个表都拥有一些由系统隐式定义的\ *system columns*\ 。因此,这些列的名字不能像用户定义的列一样使用(注意这种限制与名称是否为关键词没有关系,即便用引号限定一个名称也无法绕过这种限制)。 事实上用户不需要关心这些列,只需要知道它们存在即可。 .. container:: variablelist ``tableoid`` 包含这一行的表的OID。该列是特别为从继承层次(见\ `第 5.10 节 `__\ )中选择的查询而准备,因为如果没有它将很难知道一行来自于哪个表。\ ``tableoid``\ 可以与\ ``pg_class``\ 的\ ``oid``\ 列进行连接来获得表的名称。 ``xmin`` 插入该行版本的事务身份(事务ID)。一个行版本是一个行的一个特别版本,对一个逻辑行的每一次更新都将创建一个新的行版本。 ``cmin`` 插入事务中的命令标识符(从0开始)。 ``xmax`` 删除事务的身份(事务ID),对于未删除的行版本为0。对于一个可见的行版本,该列值也可能为非零。这通常表示删除事务还没有提交,或者一个删除尝试被回滚。 ``cmax`` 删除事务中的命令标识符,或者为0。 ``ctid`` 行版本在其表中的物理位置。注意尽管\ ``ctid``\ 可以被用来非常快速地定位行版本,但是一个行的\ ``ctid``\ 会在被更新或者被\ ``VACUUM FULL``\ 移动时改变。因此,\ ``ctid``\ 不能作为一个长期行标识符。 应使用主键来标识逻辑行。 事务标识符也是32位量。在一个历时长久的数据库中事务ID同样会绕回。但如果采取适当的维护过程,这不会是一个致命的问题。但是,长期(超过10亿个事务)依赖事务ID的唯一性是不明智的。 命令标识符也是32位量。这对一个事务中包含的SQL命令设置了一个硬极限: 2\ :sup:`32`\ (40亿)。在实践中,该限制并不是问题 — 注意该限制只是针对SQL命令的数目而不是被处理的行数。同样,只有真正 修改了数据库内容的命令才会消耗一个命令标识符。