PostgreSQL-系统列
每个表都有几个由系统隐式定义的系统列。因此,这些名称不能用作用户定义列的名称。(请注意,这些限制与名称是否是关键字是分开的;引用名称不会让您逃避这些限制。)您实际上不需要关心这些列;只知道它们存在。
tableoid
包含此行的表的 OID。该列对于从分区表或继承层次结构中进行选择的查询特别方便,因为没有它,很难判断一行来自哪个单独的表。tableoid 可以与 pg_class 的 oid 列连接以获得表名。
xmin
此行版本的插入事务的标识(事务 ID)。(行版本是行的单个状态;行的每次更新都会为同一逻辑行创建一个新的行版本。)
cmin
插入事务中的命令标识符(从零开始)。
xmax
删除事务的标识(事务 ID),或者对于未删除的行版本为零。在可见行版本中,此列可能不为零。这通常表明删除事务尚未提交,或者尝试的删除已回滚。
cmax
删除事务中的命令标识符,或零。
ctid
行版本在其表中的物理位置。请注意,尽管 ctid 可用于非常快速地定位行版本,但如果行的 ctid 被 VACUUM FULL 更新或移动,它会发生变化。因此 ctid 作为长期行标识符是无用的。应该使用主键来标识逻辑行。
事务标识符也是 32 位。在长期存在的数据库中,事务 ID 可以环绕。
命令标识符也是 32 位数量。这在单个事务中创建了 2的32次方(40 亿)条 SQL 命令的硬限制。在实践中,这个限制不是问题——请注意,限制是 SQL 命令的数量,而不是处理的行数。此外,只有实际修改数据库内容的命令才会使用命令标识符。
开启另一个会话:
未提交时:
提交后:
在另一个会话中删除:
未提交:
提交后: