在对数据库进行操作过程中我们可能会遇到这种情况,表中的数据可能重复出现,使我们对数据库的操作过程中带来读诸多不便,那么怎么删除这些重复没有用的数据呢?
平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录。
重复的数据可能有这样两种情况:
第一种:删除表中所有重复的数据
第二种:只保留重复数据中最新记录的一条记录【工作中常用】
每一行数据所对应的rowid都是独一无二的,及时表中两个数据完全相同,rowid也是不同的。我们只需要找出重复值的ROWID就可以删除重复值
模拟数据
SCOTT@PROD>Create table test as select * from emp;
SCOTT@PROD>insert into test select * from test;
-
SCOTT@PROD>insert into test select * from test;
28672 rows created.
Elapsed: 00:00:00.03
【方法一】
SCOTT@PROD>@?/rdbms/admin/utlexpt1.sql
产生exceptions表
向test表中加入(主键或是唯一约束)无法成功并把重复值rowid插入exceptions表中
SCOTT@PROD>alter table test add constraint test_empno_pk primary key(empno)
exceptions into exceptions;
SCOTT@PROD>select count(*) from exceptions;
COUNT(*)
----------
28672
删除全部重复数据
SCOTT@PROD>delete from test where rowid in (select row_id from exceptions);
28672 rows deleted.
Elapsed: 00:00:00.28
【方法二】
SCOTT@PROD>delete from test where ename in
( select ename from test group by ename having count(*)>2);
28672 rows deleted.
Elapsed: 00:00:00.34
【方法三】
方法三是建立在方法二的基础上,由于测试数据比较少,我们无法考虑到数据库大量数据的情况,大量删除数据有可能造成会将数据库吊死,所以我们可以将重复值插入到临时表中,然后再对表进行删除
SCOTT@PROD>create table test_temp1
as (select empno,ename from test group by empno,ename having count(*)>2)
SCOTT@PROD>delete from test where (empno,ename) in (select empno,ename from test_temp1);
28672 rows deleted.
Elapsed: 00:00:00.26
也是利用rowid来对数据进行处理
SCOTT@PROD>delete from test where rowid not in (select max(rowid) from test group by ename);
28658 rows deleted.
Elapsed: 00:00:00.24
创建一个临时表,向表中插入保留的rowid,
SCOTT@PROD>create table temp1(row_id urowid);
SCOTT@PROD>insert into temp1 select max(rowid) from test group by ename;
SCOTT@PROD>delete from test where rowid not in (select row_id from temp1);
28658 rows deleted.
Elapsed: 00:00:00.25
技术是分享,即是提升,也是创新,
文章如有错误,或者不同见解可以联系JAYEWU
微信1048586878 QQ:1048586878
原文:http://www.cnblogs.com/jayewu/p/7241714.html