Postgres 中“ctid”系统列的数据类型是什么?

Bas*_*que 14 postgresql uniqueidentifier datatypes postgresql-10

Postgres 系统列记录在第 5 章。数据定义 > 5.4。系统列

该页面提到oid值“是 32 位数量”。该页面对交易标识符也有同样的说法。所以我假设这意味着oid, tableoid, xmin, cmin, xmax, 和cmax都是 32 位整数。

但这离开了ctid系统列。

行版本在其表中的物理位置。请注意,尽管 ctid 可用于非常快速地定位行版本,但如果行的 ctid 被 VACUUM FULL 更新或移动,则该行的 ctid 将更改。因此 ctid 作为长期行标识符是无用的。OID,或者更好的是用户定义的序列号,应该用于标识逻辑行。

? ctid列的数据类型是什么?

具体来说,我对 Postgres 10.3 版本感兴趣,但如果它在过去的版本中发生了变化,那会很高兴知道。

Bas*_*que 13

tid

请参阅手册页,第 8 章。数据类型 > 8.18。对象标识符类型。它解释了数据类型是 Postgres 特定的,称为tid.

系统使用的最终标识符类型是 tid,或元组标识符(行标识符)。这是系统列 ctid 的数据类型。元组 ID 是一对(块编号、块内的元组索引),用于标识行在其表中的物理位置。

您可能会发现这个类似的问题很有趣:如何将 ctid 分解为页码和行号?

顺便说一句,如果您对ctid& 的这个主题感兴趣tid,您可能会对 Postgres 12 的两个新特性感兴趣:(a) OIDs 降级为普通列,以及 (b) 可插入表存储/访问方法特性Postgres 12 及更高版本。请参阅Robert Haas 博客Michael Paquier 帖子pg 黑客邮件列表中的 zheap 公告Zheap PG Wikipgcon'19 中的 Andres Anarazel youtube 视频

  • @BasilBourque 实际上他是对的;如果你用谷歌搜索删除 postgres 中没有唯一 id 的重复行,你会发现人们诉诸“ctid”几乎是唯一可行的方法。 (4认同)