2.2. 系统列 #
每个表都有几个由系统隐式定义的系统列。因此,这些名称不能用作用户定义列的名称。(注意,这些限制与名称是否为关键字无关;给名称加引号也不能绕过这些限制。)你其实不必关心这些列的细节,只需要知道它们存在即可。
oid行的对象标识符(object ID)。这是一个由 PostgreSQL 自动添加到所有表行的序列号(除非表是用
WITHOUT OIDS创建的,此时这个列不存在)。这个列的类型是oid(与列同名);该类型的更多信息见第 5.10 节。tableoid包含该行的表的 OID。这个属性对于从继承层次中选择的查询特别有用,因为如果没有它,很难判断一行来自哪个具体的表。可以把
tableoid与pg_class的oid列连接来获得表名。xmin插入该元组的事务的标识(事务 ID)。(注意:在这里的语境中,元组是行的一个具体状态;行的每次更新都会为同一个逻辑行创建一个新元组。)
cmin插入事务内的命令标识符(从零开始)。
xmax删除事务的标识(事务 ID),对未删除的元组为零。在可见的元组中这个字段也可能非零:这通常表示删除事务尚未提交,或者一次删除尝试已被回滚。
cmax删除事务内的命令标识符,或为零。
ctid元组在其表内的物理位置。注意虽然
ctid可以用来很快地定位元组,但一行的ctid在每次被更新或被VACUUM FULL移动时都会改变。因此ctid作为长期行标识符是没有用的。应该用 OID,或者更好的是用户自定义的序列号来标识逻辑行。