Oracle 的 ROWID 是那种你平时不太用,但关键时刻能救你一命的家伙。它不是主键,但它比主键还“底层”,因为它直接指向表中数据的物理位置。简单说,你要快速锁定一行数据,ROWID比走索引都快,直接原地读取,效率贼高。

不过别混了ROWIDROWNUM,后者是 Oracle 给你查询结果排个号而已。像ROWNUM = 1能取第一行,想取第 3 行?不好意思,直接用ROWNUM = 3是拿不到的。因为 Oracle 是边查边编号的,后面的行根本没机会编号。

那怎么?老办法:包一层子查询,再从外头筛。比如:

select * from (
  select rownum no, id, name from student
) where no > 2;
挺实用的套路,分页、跳过前几条啥的都能用上。

如果你想深入了解 ROWNUM 的一些坑和优化技巧,这篇文章写得还不错,思路挺清晰的。

还有哦,ROWID虽然效率高,但别当主键用。数据迁移、表重建之后,ROWID 就变,指向的东西都不一定还是原来的那一行。用它来临时定位、调试还挺香,别依赖太死就行。