如何在内部生成oracle rowid?

时间:2014-06-06 07:56:27

标签: sql oracle rowid

我想知道,oracle中的ROWID是否会逐步生成? 如果我在下面尝试查询

select min(ROWID) from table

我总是得到表中第一个插入行的ROWID,或者我可能最终获得任意随机行的ROWID? 如果有人可以在这个

中发光,那将是非常有帮助的

2 个答案:

答案 0 :(得分:5)

"最低" rowid 可能不总是提供表中第一个插入的行。引用the documentation

  

将rowid分配给行块后,rowid可能会在特殊情况下发生变化。例如,如果启用了行移动,则rowid可能会因分区键更新,闪回表操作,缩小表操作等而发生更改。如果禁用了行移动,那么如果使用Oracle数据库实用程序导出和导入行,则rowid可能会更改。

"依此类推" 表示有很多原因会导致rowid发生变化。这可以通过一个小例子轻松证明:

create table tmp_test ( a number );
insert into tmp_test values (1);
select rowid, a from tmp_test;

ROWID                       A
------------------ ----------
AABo3AAFvAAAda6AAA          1
alter table tmp_test move;
select rowid, a from tmp_test;

ROWID                       A
------------------ ----------
AABo3BAFvAAAdbjAAA          1

您注意到在alter table操作后,唯一的rowid已经改变。

如果rowid可以更改,并且Oracle没有明确保证"最低"如果需要,rowid将始终是第一个插入的行,您应该有另一种方法来跟踪它。时间戳或递​​增序列是正常的。

在不引用任何数据的情况下找到第一个插入行必须是一个非常不寻常的要求。如果您正在考虑使用此功能,请再次查看为什么您需要执行此操作。

答案 1 :(得分:0)

min(ROWID)将始终返回表格的第一行。

  

对于数据库中的每一行,ROWID伪列返回   行的地址。 Oracle数据库rowid值包含信息   找到一行是必要的:

     
      
  1. 对象的数据对象编号
  2.   
  3. 行所在的数据文件中的数据块
  4.   
  5. 数据块中行的位置(第一行为0)
  6.   
  7. 行所在的数据文件(第一个文件为1)。文件号相对于表空间。
  8.         

    通常,rowid值唯一标识数据库中的行。   但是,不同表中的行一起存储在同一个表中   集群可以具有相同的rowid。

访问官方网站Here了解更多详情。