上一文: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] 謝謝!
轉載請注明出處及作者!