一.什麼是僞列RowID?
1.首先是一種資料類型,唯一辨別一條記錄實體位置的一個id,基于64位編碼的18個字元顯示。
2.未存儲在表中,可以從表中查詢,但不支援插入,更新,删除它們的值。
二.RowID的用途
1.在開發中使用頻率應該是挺多的,特别在一些update語句中使用更加頻繁。是以oracleERP中大部份的視圖都會加入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的應用
查找和删除重複記錄,當試圖對庫表中的某一列或幾列建立唯一索引時,系統提示 ORA-01452 :不能建立唯一索引,發現重複記錄。
/*conn scott/tiger
Create table empa as select * from emp;
插入重複記錄
insert into empa select * from emp where empno = 7369;
insert into empa select * from emp where empno = 7839;
insert into empa select * from emp where empno = 7934;
*/
1.查找重複記錄的幾種方法:
a.查找大量重複記錄
select empno from empa group by empno having count(*) >1;
Select * From empa Where ROWID Not In(Select Min(ROWID) From empa GroupBy empno);
b.查找少量重複記錄
select * from empa a where rowid<>(select max(rowid) from empawhere empno=a.empno );
2.删除重複記錄的幾種方法:
a.适用于有大量重複記錄的情況(列上建有索引的時候,用以下語句效率會很高):
Delete empa Where empno In (Select empno From empa Group By empno HavingCount(*) > 1)
And ROWID Not In (Select Min(ROWID) From empa Group By empno HavingCount(*) > 1);
Delete empa Where ROWID Not In(Select Min(ROWID) From empa Group Byempno);
b.适用于有少量重複記錄的情況(注意,對于有大量重複記錄的情況,用以下語句效率會很低):
Delete empa a where rowid<>(select max(rowid) from empa whereempno=a.empno );
文章來源:http://blog.csdn.net/heqiyu34/article/details/6773689