2014-06-06 73 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永遠是第一個插排,你應該有這樣的跟蹤,如果需要的另一種方式。時間戳或遞​​增序列是正常的。

它必須找到第一個插入的行不參考任何數據非常不尋常的要求。如果這是你使用的是爲什麼你需要做的這一點,我會再看看考慮。