1、rowid是一個偽列,是用來確保表中行的唯一性,它並不能指示出行的物理位置,但可以用來定位行。
2、rowid是存儲在索引中的一組既定的值(當行確定后)。我們可以像表中普通的列一樣將它選出來。
3、利用rowid是訪問表中一行的最快方式。
4、rowid需要10個字節來存儲,顯示為18位的字符串。
rowid的組成結構為:
data object number(6位字符串) relative file number(3位字符串) block number(6位字符串) row number(3位字符串),如:AAANS3AABAAAPPqAAA
data object number(6位字符串) relative file number(3位字符串) block number(6位字符串) row number(3位字符串),如:AAANS3AABAAAPPqAAA
5、我們可以借助oracle提供的包dbms_rowid,來對rowid進行解析從而獲取關於行的相關信息:
SQL>select
2 rowid,
3 dbms_rowid.rowid_object(rowid) obj_id,
4 dbms_rowid.rowid_relative_fno(rowid) df#,
5 dbms_rowid.rowid_block_number(rowid) blknum,
6 dbms_rowid.rowid_row_number(rowid) rowno
7 from t;
3 dbms_rowid.rowid_object(rowid) obj_id,
4 dbms_rowid.rowid_relative_fno(rowid) df#,
5 dbms_rowid.rowid_block_number(rowid) blknum,
6 dbms_rowid.rowid_row_number(rowid) rowno
7 from t;
一般來說,當表中的行確定后,rowid就不會發生變化。
但當如下情況發生時,rowid將發生改變:
1、對一個表做表空間的移動后
2、對一個表進行了EXP/IMP
但當如下情況發生時,rowid將發生改變:
1、對一個表做表空間的移動后
2、對一個表進行了EXP/IMP

rowid的實際應用
在Oracle中如何利用Rowid查找和刪除表中的重復記錄
現看看我的一個簡單表的內容:

如果我利用命令:
delete from t2 where a='zongjun';的話,兩行內容將全部刪掉,而我想刪掉其中的一行內容呢?
查看表的rowid:

利用不同的rowid刪除指定的行:

這樣我們就刪掉了重復的內容,請記住rowid是完全不一樣的。
但是這樣只能適合數據少的表,但是在大型的數據庫當中,一個表可能有上千萬行的內容,因此我們不可能一條一條的去查找並且刪除。我們可以利用min(rowid)或max(rowid)來保留一條重復的內容,刪除其余所有的重復內容;如下表
SQL> select * from tt;
ID NAME
---------- --------
1 zzj
2 wang
3 li
1 zzj
1 zzj
1 zzj
1 zzj
1 gang
1 gang
---------- --------
1 zzj
2 wang
3 li
1 zzj
1 zzj
1 zzj
1 zzj
1 gang
1 gang
以上有很多內容是相同的,現在要刪除完全一樣的內容,各自保留一行即可:
SQL> delete from tt where tt.rowid not in (select min(rowid) from tt group by id,name);
5 rows deleted.
SQL> select * from tt;
ID NAME
---------- --------
1 zzj
2 wang
3 li
1 gang
---------- --------
1 zzj
2 wang
3 li
1 gang
5行已被刪除,但是現在還有id一樣的行,要保留一行,如下
SQL> delete from tt where tt.rowid not in (select min(rowid) from tt group by id);
1 row deleted.
SQL> select * from tt;
ID NAME
---------- --------
1 zzj
2 wang
3 li
---------- --------
1 zzj
2 wang
3 li
其中的min(rowid)可以換成max(rowid),這樣將會保留最大的rowid,而刪除其他的。這里只能利用函數min和max保留最大或者最小的。