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)

你可能感兴趣的:(oracle,delete,truncate,rowid,rownum)