oracle 批量删除表数据的4种方式 202523609编辑
Heaven helps those who help themselves
资深码农+深耕理财=财富自由
欢迎关注
资深码农+深耕理财=财富自由
欢迎关注

oracle 批量删除表数据的4种方式
Created by Marydon on 2018-12-05 18:19
1.情景展示
情景一:
删除PRIMARY_INDEX_TEST表中,MINDEX_ID字段为空的数据
情景二:
删除VIRTUAL_CARD_TEST表中的脏数据
2.解决方案
情景一的解决方案:
DELETE FROM PRIMARY_INDEX_TEST WHERE MINDEX_ID IS NULL
情景二的解决方案:
最简单的方法,见文末 2019/10/17
2018/12/10
方案1:使用快速游标法(删除一次提交一次);
1 --快速游标法 2 BEGIN 3 FOR TEMP_CURSOR IN (SELECT ID 4 FROM VIRTUAL_CARD3 5 WHERE INSTR(NAME, '*') > 0 6 UNION 7 SELECT ID 8 FROM VIRTUAL_CARD3 9 WHERE INSTR(NAME, '#') > 0 10 UNION 11 SELECT ID 12 FROM VIRTUAL_CARD3 13 WHERE INSTR(NAME, '/') > 0 14 UNION 15 SELECT ID 16 FROM VIRTUAL_CARD3 17 WHERE INSTR(NAME, '+') > 0 18 UNION 19 SELECT ID 20 FROM VIRTUAL_CARD3 21 WHERE INSTR(NAME, '!') > 0 22 UNION 23 SELECT ID 24 FROM VIRTUAL_CARD3 25 WHERE INSTR(NAME, '.') > 0) LOOP 26 /* LOOP循环的是TEMP_CURSOR(逐条读取TEMP_CURSOR) */ 27 DELETE FROM VIRTUAL_CARD3 WHERE VIRTUAL_CARD3.ID = TEMP_CURSOR.ID; 28 COMMIT; --提交 29 END LOOP; 30 END;
执行时间:
方案2:更多游标使用方法,见文末推荐;
方案3:使用存储过程按id进行逐条删除。
1 CREATE OR REPLACE PROCEDURE DELETE_TABLE_BATCH(V_ROWS IN NUMBER /*删除多少条数据后进行提交*/) IS 2 /** 3 * 内容: 4 * 日期:2018/12/05 5 * 作者:Marydon 6 * 版本:1.0 7 */ 8 I NUMBER(10); --声明变量,用于记录次数 9 BEGIN 10 FOR TEMP_TABLE IN (SELECT ID 11 FROM VIRTUAL_CARD_TEST 12 WHERE INSTR(NAME, '*') > 0 13 UNION 14 SELECT ID 15 FROM VIRTUAL_CARD_TEST 16 WHERE INSTR(NAME, '#') > 0 17 UNION 18 SELECT ID 19 FROM VIRTUAL_CARD_TEST 20 WHERE INSTR(NAME, '/') > 0 21 UNION 22 SELECT ID 23 FROM VIRTUAL_CARD_TEST 24 WHERE INSTR(NAME, '+') > 0 25 UNION 26 SELECT ID 27 FROM VIRTUAL_CARD_TEST 28 WHERE INSTR(NAME, '!') > 0 29 UNION 30 SELECT ID 31 FROM VIRTUAL_CARD_TEST 32 WHERE INSTR(NAME, '.') > 0) LOOP 33 /* LOOP循环的是TEMP_TABLE(逐条读取TEMP_TABLE) */ 34 DELETE VIRTUAL_CARD_TEST WHERE VIRTUAL_CARD_TEST.ID = TEMP_TABLE.ID; 35 I := I + 1; --删除一次,+1 36 IF I >= V_ROWS THEN 37 COMMIT; --提交 38 I := 0; --重置 39 END IF; 40 END LOOP; 41 EXCEPTION 42 /* 输出异常信息 */ 43 WHEN OTHERS THEN 44 DBMS_OUTPUT.PUT_LINE('异常编号:' || SQLCODE); 45 DBMS_OUTPUT.PUT_LINE('异常信息:' || SQLERRM); 46 ROLLBACK; --回滚 47 END DELETE_TABLE_BATCH;
创建并运行该存储过程
删除16522条数据,用了6分21秒,比方式一慢太多了。
方案4:
将要保留的数据插入到新表
1 --将要保留的数据插入到新表 2 CREATE TABLE VIRTUAL_CARD_TEMP2 AS( 3 SELECT * 4 FROM VIRTUAL_CARD2 5 WHERE INSTR(NAME, '*') = 0 6 AND INSTR(NAME, '#') = 0 7 AND INSTR(NAME, '/') = 0 8 AND INSTR(NAME, '+') = 0 9 AND INSTR(NAME, '!') = 0 10 AND INSTR(NAME, '.') = 0)
删除原来的表
--删除原表 drop table VIRTUAL_CARD2
将新建的表进行重命名成删除表的名称。
说明:原来的表有过存在外键约束等关系时,并没有进行测试,因为该表没有索引之类东西,自己测试的时候一定要慎重!!!
方案5:使用in函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | DELETE FROM VIRTUAL_CARD_TEMP WHERE ID_CARD IN ( SELECT T1.ID_CARD FROM VIRTUAL_CARD_TEMP T1 WHERE INSTR(T1. NAME , '*' ) > 0 UNION SELECT T1.ID_CARD FROM VIRTUAL_CARD_TEMP T1 WHERE INSTR(T1. NAME , '#' ) > 0 UNION SELECT T1.ID_CARD FROM VIRTUAL_CARD_TEMP T1 WHERE INSTR(T1. NAME , '/' ) > 0 UNION SELECT T1.ID_CARD FROM VIRTUAL_CARD_TEMP T1 WHERE INSTR(T1. NAME , '+' ) > 0 UNION SELECT T1.ID_CARD FROM VIRTUAL_CARD_TEMP T1 WHERE INSTR(T1. NAME , '!' ) > 0 UNION SELECT T1.ID_CARD FROM VIRTUAL_CARD_TEMP T1 WHERE INSTR(T1. NAME , '.' ) > 0) |
说明:ID_CARD字段必须具有唯一性。
写在最后
哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!
相关推荐:
与君共勉:最实用的自律是攒钱,最养眼的自律是健身,最健康的自律是早睡,最改变气质的自律是看书,最好的自律是经济独立 。
您的一个点赞,一句留言,一次打赏,就是博主创作的动力源泉!
↓↓↓↓↓↓写的不错,对你有帮助?赏博主一口饭吧↓↓↓↓↓↓
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/10072539.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?