postgresql虽无oracle的ROWID,但可通过ctid标识行物理位置,或用自增主键、UUID实现稳定唯一标识,推荐生产环境使用逻辑主键。

PostgreSQL 没有像 Oracle 那样的 ROWID 概念,也就是说它不提供内置的、唯一的物理地址标识每一行记录。但 PostgreSQL 提供了类似的机制来实现相近功能。
PostgreSQL 中的替代方案
虽然没有 ROWID,但可以通过以下方式模拟或实现类似效果:
- ctid:这是最接近 ROWID 的概念。每个行记录都有一个隐含的系统列 ctid,表示该行在表中的物理位置(块号和块内项索引)。例如:
select ctid, * FROM your_table;
注意:ctid 在 VACUUM FULL 或行被更新后可能会变化,因此不能作为长期稳定的唯一标识。 - OID:如果创建表时启用了 OID(
WITH OIDS),每行会分配一个唯一的 OID。但这种方式从 PostgreSQL 12 开始已被弃用,不推荐使用。 - 自增主键:通常更推荐的做法是显式定义一个 SERIAL 或 IDENTITY 列作为逻辑主键,例如:
id SERIAL PRIMARY KEY
这种方式生成的 ID 是逻辑唯一且稳定的,适合做应用层面的行标识。
ctid 的典型用途
ctid 常用于临时去重或调试场景。比如删除完全重复的行:
delete FROM your_table a WHERE ctid < (SELECT min(ctid) FROM your_table b WHERE a.key = b.key);
这利用 ctid 找出重复数据中“物理位置”靠前的那一行保留。
总结
PostgreSQL 不提供 ROWID,但 ctid 可用于临时定位行的物理位置,而生产环境更应使用自增主键或 UUID 来保证行的唯一标识。依赖物理位置的标识存在局限性,逻辑主键才是稳定可靠的选择。