天天看點

Oracle系列:僞列RowIDOracle系列:僞列RowID

上一文:Oracle系列:Oracle資料類型

連結:http://blog.csdn.net/qfs_v/archive/2008/05/12/2435213.aspx

Oracle系列:僞列RowID

一,什麼是僞列RowID?

 1,首先是一種資料類型,唯一辨別一條記錄實體位置的一個id,基于64位編碼的18個字元顯示。

 2,未存儲在表中,可以從表中查詢,但不支援插入,更新,删除它們的值。

二,RowID的用途

 1,在開發中使用頻率應該是挺多的,特别在一些update語句中使用更加頻繁。是以oracle ERP中大部份的視圖都會加入rowid這個字段。

  在一些cursor定義時也少不了加入rowid。但往往我們在開發過程中,由于連接配接的表很多,再加上程式的複制,有時忽略了rowid對應的是那一個表中rowid,是以有時過程出錯,

  往往發上很多時間去查錯,最後查出來既然是update時帶的rowid并非此表的rowid,是以在發現很多次的錯誤時,重視rowid起來了,開發中一定要注意rowid的比對

 2,能以做快的方式通路表中的一行。

 3,能顯示表的行是如何存儲的。

 4,作為表中唯一辨別。

三,RowID的組成

 rowid确定了每條記錄是在Oracle中的哪一個資料對象,資料檔案、塊、行上。

 ROWID 的格式如下:

  資料對象編号        檔案編号        塊編号            行編号

  OOOOOO             FFF                BBBBBB    RRR

  由  data_object_id# +  rfile#  +  block#  +  row#   組成,占用10個bytes的空間,

   32bit的 data_object_id#, 

   10 bit 的 rfile#,  

   22bit 的 block#, 

   16 bit 的 row#.  

  是以每個表空間不能超過1023個 資料檔案。

 如想深入了解ROWID 組成請參考:http://www.beelink.com/20071108/2430451.shtml

四,RowID的應用

 1,查找和删除重複記錄

  當試圖對庫表中的某一列或幾列建立唯一索引時,

  系統提示 ORA-01452 :不能建立唯一索引,發現重複記錄。

  查找重複記錄的幾種方法:

   查找大量重複記錄

   select empno  from empa group by empno having count(*) >1;

   Select  *  From empa  Where ROWID Not  In(Select Min(ROWID)  From empa  Group By  empno);

   查找少量重複記錄

   select *  from empa a where rowid<>(select max(rowid) from empa where empno=a.empno );

  删除重複記錄的幾種方法:

   (1).适用于有大量重複記錄的情況(列上建有索引的時候,用以下語句效率會很高):

   Delete empa Where empno In (Select empno From empa Group By empno Having Count(*) > 1)

   And ROWID Not In (Select Min(ROWID)  From empa Group By empno Having Count(*) > 1);

   Delete empa Where ROWID Not  In(Select Min(ROWID)  From empa  Group By  empno);

   (2).适用于有少量重複記錄的情況(注意,對于有大量重複記錄的情況,用以下語句效率會很低):

   Delete empa a where rowid<>(select max(rowid) from empa where empno=a.empno );

  2,恢複Oracle資料庫中資料

   待續。

下一文:Oracle系列:記錄Record

有問題或指正請聯系:[email protected] 謝謝!

轉載請注明出處及作者!