oracle筆記整理5——delete與truncate,rowid與rownum,刪除重複記錄

1) delete與truncate

a) delete一行一行刪除,並且記錄日誌,truncate釋放用於存儲表數據的數據頁(extent)來刪除數據,在日誌中只記錄頁的釋放,故無法rollback,也無法flashback,從物理結構上來說,truncate之後,表所在的段頭信息(segment header)被摧毀,導致段-區-數據塊之間的路徑被截斷,無法查詢到數據塊上的數據,感覺就跟刪除了一樣。

b) delete時鎖定行來刪除,truncate時鎖定表來刪除。

c) delete刪除數據後,表的高水平線不變,而truncate之後,表的高水平線重置爲0,因此delete之後表所佔空間不釋放,而truncate之後表所佔表空間釋放。

d) truncate恢復
反向構造段頭塊→修改數據字典→修改段頭塊上的高水平線值。
http://www.aiweibang.com/yuedu/70298231.html

2) rowid與rownum

a) rowid是物理存在,表示記錄在表空間中的唯一位置ID。

b) rownum是在已查詢出的結果集上加的一個僞列(強調:先要有結果集),簡單的說,rownum是符合條件的結果的序列號。它總是從1開始排起的,所以你選出的結果不可能沒有1,而有比1大的值,任何時候想把rownum=1這條記錄拋棄是不對的,它在結果集中是不可或缺的。例如 rownum = 2 就永遠也查不出數據來,因爲第一條記錄的rownum=1,不符合rownum=2的條件,被刪除,接着從緩衝區取第二條記錄,上來之後它的rownum還是1,還是被刪除,依次類推。

c) 如何才能只得到rownum第二行及以後的數據,兩種方法

d) 子查詢中別名化rownum列(也是一種分頁技術):

select rownum,name from (select rownum no,name from table_name)tt where tt.no > 2;

e) minus關鍵字

selectfromwhere rownum < 4
minus
selectfromwhere rownum < 2;

f) 有order by 子句時,rownum不是按照順序輸出的,這說明rownum與列數據無關,可以通過在外面套一層查詢再次輸出來避免rownum亂序。

3) 刪除重複記錄

delete from table where xxx in (select xxx from table group by xxx having count(xxx) > 1) and rowid not in (select min(rowid) from table group by xxx having count(xxx) > 1)
發佈了114 篇原創文章 · 獲贊 24 · 訪問量 57萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章