天天看點

oracle僞列rowid和rownum

一.什麼是僞列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