ORACLE批量删除无主键重复数据
1.需求说明
TEST表情况说明:
- 按月进行分区的分区表
- 未定义主键或唯一索引
- 包含COL1,COL2,COL3,INSERTTIME四列
现需要删除2019年3月31日当天存在的重复数据
2.解决方法
2.1 确认无重复数据的记录数
SELECT COUNT(1) FROM (
SELECT COL1,COL2,COL3,INSERTTIME FROM TEST PARTITION(P201903) A
WHERE INSERTTIME >= DATE'2019-03-31' AND INSERTTIME < DATE'2019-04-01'
GROUP BY COL1,COL2,COL3
);
复制
2.2 梳理需要筛选的数据
由于原表A数据量特别大,此处新建一张表将需要处理的数据单独存放
CREATE TABLE TEST_TMP NOLOGGING AS
SELECT /*PARALLEL +8 */ A.*,A.ROWID ROWID_OLD FROM TEST PARTITION(P201903) A
WHERE INSERTTIME >= DATE'2019-03-31' AND INSERTTIME < DATE'2019-04-01';
复制
2.2 确认需要删除的数据
理论上而言需要删除和需要保留的数据记录数应相等
--需要删除的数据记录数
SELECT COUNT(1) FROM TEST PARTITION(P201903) A WHERE ROWID IN (
SELECT MIN(ROWID_OLD) ROWID_OLD FROM TEST_TMP
WHERE INSERTTIME >= DATE'2019-03-31' AND INSERTTIME < DATE'2019-04-01'
GROUP BY COL1,COL2,COL3,INSERTTIME
HAVING COUNT(1) > 1)
AND INSERTTIME >= DATE'2019-03-31' AND INSERTTIME < DATE'2019-04-01'
--需要保留的数据记录数
SELECT COUNT(1) FROM TEST PARTITION(P201903) A WHERE ROWID NOT IN (
SELECT MIN(ROWID_OLD) ROWID_OLD FROM TEST_TMP
WHERE INSERTTIME >= DATE'2019-03-31' AND INSERTTIME < DATE'2019-04-01'
GROUP BY COL1,COL2,COL3,INSERTTIME
HAVING COUNT(1) > 1)
AND INSERTTIME >= DATE'2019-03-31' AND INSERTTIME < DATE'2019-04-01'
复制
2.3 利用分批提交删除重复数据
DECLARE
TYPE ROWID_LIST IS TABLE OF UROWID INDEX BY BINARY_INTEGER;
ROWID_INFOS ROWID_LIST;
I NUMBER;
CURSOR C_ROWIDS IS (SELECT MIN(ROWID_OLD) ROWID_OLD
FROM TEST_TMP
WHERE INSERTTIME >= DATE'2019-03-31' AND INSERTTIME < DATE'2019-04-01'
GROUP BY COL1,COL2,COL3,INSERTTIME
HAVING COUNT(1) > 1);
BEGIN
OPEN C_ROWIDS;
LOOP
--此处LIMIT后的值为分批提交的记录数,可以根据实际情况调整
FETCH C_ROWIDS BULK COLLECT INTO ROWID_INFOS LIMIT 10000;
FORALL I IN 1..ROWID_INFOS.COUNT
--如下的DELETE语句为分批提交实际需要执行的部分
DELETE FROM TEST WHERE ROWID=ROWID_INFOS(I);
COMMIT;
EXIT WHEN ROWID_INFOS.COUNT<10000;
END LOOP;
CLOSE C_ROWIDS;
END;
复制
2.4 确认无重复数据
SELECT * FROM (
SELECT COL1,COL2,COL3,INSERTTIME FROM TEST PARTITION(P201903) A
WHERE INSERTTIME >= DATE'2019-03-31' AND INSERTTIME < DATE'2019-04-01'
GROUP BY COL1,COL2,COL3,INSERTTIME
HAVING COUNT(1)>1 )
);
复制
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
赞,大佬的Markdown写得好
5年前

1
相关阅读
数据库国产化替代深化:DBA的机遇与挑战
代晓磊
1314次阅读
2025-04-27 16:53:22
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
796次阅读
2025-04-18 14:18:38
2025年4月国产数据库中标情况一览:4个千万元级项目,GaussDB与OceanBase大放异彩!
通讯员
794次阅读
2025-04-30 15:24:06
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
666次阅读
2025-04-15 17:24:06
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
597次阅读
2025-04-20 10:07:02
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
551次阅读
2025-04-22 00:13:51
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
535次阅读
2025-04-17 17:02:24
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
510次阅读
2025-04-22 00:20:37
一页概览:Oracle GoldenGate
甲骨文云技术
502次阅读
2025-04-30 12:17:56
GoldenDB数据库v7.2焕新发布,助力全行业数据库平滑替代
GoldenDB分布式数据库
481次阅读
2025-04-30 12:17:50