You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何PostgreSQL在多张不同表中返回相同的ctid值?

关于PostgreSQL中ctid的正确理解

你对ctid的核心误解在于把它当成了磁盘全局的物理位置,实际上它是表内的局部物理标识符,具体细节如下:

  • ctid的(page_id, 偏移量)是相对于当前表的存储文件而言的,并非磁盘全局的绝对地址。PostgreSQL会为每个表生成独立的存储文件(路径大致为$PGDATA/base/[数据库OID]/[表OID]),每个表的页号都从0开始单独计数。所以不同表出现相同的ctid,只是各自表文件里的对应位置,对应完全不同的磁盘存储点。
  • ctid的作用是快速定位当前表内的元组,比如执行SELECT * FROM table WHERE ctid = '(0,1)'能直接找到该表第0页的第一个元组,但这个值仅在当前表内有效,跨表没有意义。
  • 注意:ctid并非固定不变,当执行VACUUM FULL、UPDATE(PostgreSQL的UPDATE是写入新元组并标记旧元组失效)等操作时,元组的物理位置会发生变化,ctid也会随之改变,因此绝对不能用ctid作为行的永久唯一标识(应该使用主键)。

内容的提问来源于stack exchange,提问作者Marco Polo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:39:53