PostgreSQL 表的隐藏字段

PostgreSQL 数据库中的表,有几个字段是系统字段,这些字段是隐藏的,在 psql 中使用 \d 命令不会显示这些字段。用户在定义表结构时,字段名称不能与这些系统隐藏字段相同。

隐藏字段如下:
  • oid,行对象标识符,这个字段只有在创建表时使用了 with oids 或者配置参数 default_with_oids 为真时,才会出现。
  • tableoid,包含当前行的表 oid。
  • xmin,插入该行版本的事务ID。
  • xmax,删除此行的事务ID,第一次插入时,该字段为 0
  • cmin,事务内部插入类操作的命令 ID,此标识是从 0 开始的。
  • cmax,事务内部删除类操作的命令ID,如果不是删除命令,此字段为 0 。
  • ctid,一个行版本在它所处的表内的物理位置。
oid:

PostgreSQL 内部使用的标识符,用来作为系统表的主键。用户创建的表默认不带 oid 字段,如果用户在创建表时指定 with oids 子句,则用户表也会包含 oid 字段。oid 类型为 4 字节无符号整数,oid 的序列值是全局的,也就是所有表共享 oid 序列,因此它提供的数值范围有限,PostgreSQL 官方不建议用户表带有 oid 字段。

ctid:

表示数据行在其所处的表中的物理位置,ctid 类型为 tid,ctid 可以快速地定位数据行,但是 vacuum full 之后,数据行的物理位置会变动,导致其 ctid 发生变化,不能使用 ctid 作为长期的行数据的标识,应该使用主键来标识一个逻辑行数据。

PostgreSQL 支持查询 ctid 值,以及按 ctid 来查询记录,示例如下:

pg=# select ctid,id,name from tb;  ctid  | id | name -------+----+------  (0,1) |  1 | abc  (0,2) |  2 | efg (2 rows) pg=# select ctid,id,name from tb where ctid='(0,2)';  ctid  | id | name -------+----+------  (0,2) |  2 | efg (1 row)