2014-06-06 36 views
2

我想知道,oracle中的ROWID是否增量生成? 如果我尝试下面的查询如何在内部生成oracle rowid?

select min(ROWID) from table 

我总是会得到第一插入行的ROWID表或我可能最终得到任何随机行也的ROWID? 这将是非常有益的,如果有人可以请扔光

回答

0

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

对于数据库中的每一行,ROWID伪列返回该行的 地址。 Oracle数据库ROWID值包含必要的信息 来定位行:

  1. 的对象的数据对象数
  2. 在其中行驻留在
  3. 的行的位置上的数据文件的数据块数据块(第一行是0)
  4. 的数据文件,其中所述行驻留(第一文件为1)。文件编号是相对于表空间的。

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

前往官方网站Here了解更多详情。

4

“最小”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可以改变和甲骨文没有明确保证“最低”的rowid永远是第一个插排,你应该有这样的跟踪,如果需要的另一种方式。时间戳或递​​增序列是正常的。

它必须找到第一个插入的行不参考任何数据非常不寻常的要求。如果这是你使用的是为什么你需要做的这一点,我会再看看考虑。