delete-drop语句生成的存储过程
问题:
开发时有时候需要对很多表进行操作。
例如:清空(删除)所有(某些)表,删除所有表某时间点之后导入的数据(类似于回滚)
解决方式:
对选定的表集合执行相同的查询条件(可为空),如果这个执行结果大于阈值,则使用相同的条件组建delete语句。
delete_drop_sql生成器用法:
delete_drop_sql_generator
(var_where [where条件,可以为空,例如:" where LEFT(CREATE_time,19)>'2021-08-04'"]
,var_include_tbl_list [要包含的表名列表,优先于var_exclude_tbl_list,例如:"tbl_name1,tbl_name2"]
,var_exclude_tbl_list [要排除的表名列表,仅在var_include_tbl_list为空时生效,例如:"tbl_name1,tbl_name2"]
,var_greater_than_value [符合where条件要过滤的值,count(*)>=0 ]
)


1 -- -- powered by wanglifeng https://www.cnblogs.com/wanglifeng717
2 DROP PROCEDURE IF EXISTS delete_drop_sql_generator;
3 DELIMITER %%
4 CREATE PROCEDURE delete_drop_sql_generator(var_where VARCHAR(2048),var_include_tbl_list VARCHAR(2048),var_exclude_tbl_list VARCHAR(2048),var_greater_than_value VARCHAR(100))
5 label:BEGIN
6
7 /*------------每个表使用同样的过滤条件---------------------------------*/
8 /*
9 -- -- powered by wanglifeng https://www.cnblogs.com/wanglifeng717
10 适用场景:
11 1.将所有表2021-08-01日插入的记录全部删除。例如刚配置业务数据全部删除,只要确定某个时间段,只有你的数据在里面
12
13 2.将某些表相同字段的记录删除,自定义哪些表,必须同时含有where条件中的字段。
14 */
15 DROP TABLE if exists temp_filter_table;
16 DROP TABLE if exists temp_var_query_table;
17 CREATE table temp_var_query_table(tbl_name VARCHAR(512));
18
19 /*-----------------------------------------------------------------------------*/
20 -- ----------配置项目-----------
21 -- -- powered by wanglifeng https://www.cnblogs.com/wanglifeng717
22 /*-----------------------------------------------------------------------------*/
23 SET @var_where = var_where;
24 -- "LEFT(create_time,19)>'2021-08-04'";-- 格式:2021-08-11 16:32:37.872
25 -- select @var_where;
26
27 -- 如果含有include,则已include为准。
28 if(var_include_tbl_list IS NULL OR var_include_tbl_list='include_tbl_list' OR var_include_tbl_list='' OR var_include_tbl_list=' ' OR var_include_tbl_list=' ') then
29 if(var_exclude_tbl_list IS NULL OR var_exclude_tbl_list='exclude_tbl_list' OR var_exclude_tbl_list='' OR var_exclude_tbl_list=' ' OR var_exclude_tbl_list=' ') then
30 -- 如果包含和不含字段都是为空,将库中所有的表加入进去。
31 INSERT INTO temp_var_query_table SELECT t.table_name FROM information_schema.tables t WHERE table_schema=DATABASE() AND t.TABLE_NAME !='temp_var_query_table';
32 else
33 -- 如果include为空,但是exclude不为空
34 SET @exec_sql = CONCAT_WS('',"INSERT INTO temp_var_query_table SELECT t.table_name FROM information_schema.tables t WHERE table_schema=DATABASE() AND t.TABLE_NAME not in ('", REPLACE(var_exclude_tbl_list, ',',CONCAT_WS('',"','")),"')");
35 PREPARE stmt FROM @exec_sql;
36 EXECUTE stmt;
37 DEALLOCATE PREPARE stmt;
38 END if;
39 ELSE
40 -- 插入静态字段
41 SET @exec_sql = CONCAT_WS('',"INSERT INTO temp_var_query_table SELECT t.table_name FROM information_schema.tables t WHERE table_schema=DATABASE() AND t.TABLE_NAME in ('", REPLACE(var_include_tbl_list, ',',CONCAT_WS('',"','")),"')");
42 PREPARE stmt FROM @exec_sql;
43 EXECUTE stmt;
44 DEALLOCATE PREPARE stmt;
45 END if;
46
47 -- select @exec_sql;
48
49 -- 自定义查找,如果自定义查找,请注释掉上面默认的全库查找
50
51 -- INSERT INTO temp_query_table VALUES ('tbl_act_class'), ('tbl_act_info');
52
53
54 /*-----------------------------------------------------------------------------*/
55 /*---------------------配置项结束--------------------------------------*/
56 -- -- powered by wanglifeng https://www.cnblogs.com/wanglifeng717
57 /*-----------------------------------------------------------------------------*/
58
59
60 SET group_concat_max_len = 4294967295;
61
62 -- select count(*) as "条数","tbl_cbm_app_entrance" as "表名","select count(*) from tbl_cbm_app_entrance where LEFT(CREATE_time,19)>'2021-08-04'" as "执行的脚本" from tbl_cbm_app_entrance where LEFT(CREATE_time,19)>'2021-08-04'
63 SET @query_code='
64 select (@row_id:=@row_id+1) as "序号", count(*) as "num","@tbl_name" as "tbl_name","select count(*) from @tbl_name @var_where ;" as "执行的脚本" from @tbl_name, (select @row_id:=0 ) t @var_where
65 ';
66 SELECT REPLACE(@query_code,'@var_where',@var_where) INTO @query_code;
67
68 SELECT GROUP_CONCAT(
69 t.temp SEPARATOR '\r\n union all \r\n') INTO @var_query_sql
70 FROM
71 (
72 SELECT
73 REPLACE(@query_code,'@tbl_name',t.TABLE_NAME) as temp
74 FROM information_schema.tables t
75 WHERE table_schema=DATABASE() AND t.table_name IN( SELECT * FROM temp_var_query_table WHERE tbl_name NOT IN('temp_var_query_table'))
76 ) t;
77
78 -- select @var_query_sql;
79
80 SET @exe_sql = @var_query_sql;
81 PREPARE stmt FROM @exe_sql;
82 EXECUTE stmt;
83 DEALLOCATE PREPARE stmt;
84
85
86 -- 组成建表语句
87 /*create table temp_var_tbl_name as
88 select t.tbl_name from
89 (select count(*) as num, 'tbl_act_black_white_list' as tbl_name from tbl_act_black_white_list where LEFT(CREATE_time,19)>'2021-08-04'
90 union all
91 select count(*) as num, 'tbl_act_card_group' as tbl_name from tbl_act_card_group where LEFT(CREATE_time,19)>'2021-08-04'
92 ) t where t.num>=1;
93 */
94
95 DROP TABLE if exists temp_filter_table;
96 SET @exe_sql = CONCAT_WS('','create table temp_filter_table as select t.tbl_name from (',@var_query_sql,') t where t.num>=',var_greater_than_value);
97
98 PREPARE stmt FROM @exe_sql;
99 EXECUTE stmt;
100 DEALLOCATE PREPARE stmt;
101
102 -- select @exe_sql;
103
104
105
106 SELECT CONCAT(
107 'SET FOREIGN_KEY_CHECKS = 0;',
108 '\r\n',
109 GROUP_CONCAT(
110 CONCAT('drop table ',' ',tbl_name,'; ')
111 SEPARATOR '\r\n'
112 ),
113 '\r\n',
114 'SET FOREIGN_KEY_CHECKS = 1;'
115 ) INTO @drop_sql_code
116 FROM temp_filter_table;
117
118 SELECT CONCAT(
119 'SET FOREIGN_KEY_CHECKS = 0;',
120 '\r\n',
121 GROUP_CONCAT(
122 CONCAT_WS('','delete from ',tbl_name,' ',@var_where,';')
123 SEPARATOR '\r\n'
124 ),
125 '\r\n',
126 'SET FOREIGN_KEY_CHECKS = 1;'
127 ) INTO @delete_sql_code
128 FROM temp_filter_table;
129
130 SELECT CONCAT(
131 'SET FOREIGN_KEY_CHECKS = 0;',
132 '\r\n',
133 GROUP_CONCAT(
134 CONCAT_WS('','select * from ',tbl_name,' ',@var_where,';')
135 SEPARATOR '\r\n'
136 ),
137 '\r\n',
138 'SET FOREIGN_KEY_CHECKS = 1;'
139 ) INTO @select_sql_code
140 FROM temp_filter_table;
141
142 SELECT '代码','作用' LIMIT 0
143 UNION ALL
144 SELECT @select_sql_code ,'查询语句'
145 UNION ALL
146 SELECT @delete_sql_code,'删除语句'
147 UNION ALL
148 SELECT @drop_sql_code ,'drop表语句';
149
150 DROP TABLE if exists temp_filter_table;
151 DROP TABLE if exists temp_var_query_table;
152 END %%
153 DELIMITER ;
154
155 -- SELECT * from temp_var_query_table;
156
157 -- CALL delete_drop_sql_generator(" where LEFT(CREATE_time,19)>'2021-08-04'",'','','0');
delete_drop_sql语句生成器
打印删除所有存储过程和数据库函数语句的存储过程
print_drop_all_proc_sql(
in_dbname [数据库名字 ]
)


1 -- 生成删除所有存储过程和函数的语句
2 -- -- powered by wanglifeng https://www.cnblogs.com/wanglifeng717
3 DELIMITER $$
4 DROP PROCEDURE IF EXISTS `print_drop_all_proc_sql`$$
5 CREATE PROCEDURE `print_drop_all_proc_sql`(in_dbname VARCHAR(200))
6 BEGIN
7 DECLARE var_count INT;
8 DECLARE var_name VARCHAR(200);
9 DECLARE var_type VARCHAR(200);
10
11 -- 获取所有的存储过程和函数
12 DECLARE pro_funcs CURSOR FOR SELECT routine_name,routine_type FROM information_schema.routines WHERE routine_schema = in_dbname;
13 SELECT COUNT(*) INTO var_count FROM information_schema.Routines WHERE routine_schema = in_dbname;
14 OPEN pro_funcs;
15 SET FOREIGN_KEY_CHECKS = 0;
16 SET @pro_func=NULL;
17 loop_i:LOOP
18 IF var_count = 0 THEN
19 LEAVE loop_i;
20 END IF;
21 FETCH pro_funcs INTO var_name,var_type;
22 -- 必须用concat_ws,不然有null,拼出来全部是空。char(10)或者“\r\n都可以”
23 SET @pro_func=CONCAT_WS('',@pro_func,' drop ',var_type, ' `',in_dbname,'`.`',var_name,'`;',"\r\n");
24
25 SET var_count = var_count - 1;
26 END LOOP;
27 CLOSE pro_funcs;
28 SET FOREIGN_KEY_CHECKS = 1;
29 SELECT @pro_func;
30 END$$
31 DELIMITER ;
print_drop_all_proc_sql存储过程
本文来自博客园,作者:wanglifeng,转载请注明原文链接:https://www.cnblogs.com/wanglifeng717/p/15838755.html
delete-drop语句生成的存储过程的更多相关文章
- insert语句生成的存储过程
问题: 1.如何配置数据库数据: 方式一:图形界面点击输入数据,导出成sql. 缺点:表多,数据多的时候非常繁琐,字段含义需要另外开窗口对照. 方式二:徒手写或者修改已有语句:insert table ...
- SQL 语句调用这个存储过程,生成顺序编码
一直很讨厌存储过程,没想到今天帮了我大忙啊,或许会因为今天让我慢慢喜欢上存储过程吧,不多说了,切入正题 在使用数据库的时候,难免要在使用过程中进行删除的操作,如果是使用int类型的字段,令其自增长,这 ...
- truncate,delete,drop的异同点
说明:本文摘自oracle技术用户讨论组 truncate,delete,drop的异同点 注意:这里说的delete是指不带where子句的delete语句 相同点:truncate和不带w ...
- sql 删除表格delete drop truncate 区别(转)
(1) DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作.TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把 ...
- (转)iOS sqlite :truncate/delete/drop区分
转自:http://blog.sina.com.cn/s/blog_6755689f0101fofb.html 相同点: 1.truncate和不带where子句的delete.以及drop都会删除表 ...
- delete drop truncate
一.相同点 1 truncate.不带where子句的delete.drop都会删除表内的数据2 drop.truncate都是DDL语句(数据定义语言),执行后会自动提交 二.不同点 1trunca ...
- sql 删除表数据truncate delete drop的区别
已下内容为转载内容:学习之用 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL语句(数据定义语言),执行后会自动提交. ...
- PLSQL_标准删除的方式Delete/Drop/Truncate区别和比较(概念)
2014-06-02 Created By BaoXinjian
- SQL truncate/delete/drop 区别
相同点 1. truncate 和不带 where 子句的 delete 以及 drop 都会删除表内的数据. 2. drop/truncate 都是 DDL 语句(数据定义语言),执行后会自动提交. ...
随机推荐
- IDEA terminal无法从vim的编辑模式转换为命令模式
Git 修改最后一次的commit历史记录:https://www.baidu.com/link?url=2WF8yFd0iBuVmXLWfutmSoXa12K9D143e_B0A3PTYYHEP9r ...
- 什么是 Swagger?你用 Spring Boot 实现了它吗?
Swagger 广泛用于可视化 API,使用 Swagger UI 为前端开发人员提供在线沙箱.Swagger 是用于生成 RESTful Web 服务的可视化表示的工具,规范和完整框架实现.它使文档 ...
- vue使用svg,animate事件绑定无效问题及解决方法
由于使用svg制作圆形进度条,但是进度展示的太生硬,没有过渡圆滑的效果,所以使用 animate(在svg元素里可以查到) 元素标签,但 这样使用了,还是没有效果,我前端使用的 vue ,所以通过 @ ...
- 四、Springboot+jpa+mycat应用
一.后台配置文件 # 连接地址 url: jdbc:mysql://127.0.0.1:8066/CHUNK?useUnicode=true&characterEncoding=utf-8&a ...
- JVM 选项 -XX:+UseCompressedOops 有什么作用? 为什么要使用?
当你将你的应用从 32 位的 JVM 迁移到 64 位的 JVM 时,由于对象的指针从 32 位增加到了 64 位,因此堆内存会突然增加,差不多要翻倍.这也会对 CPU 缓存(容量比内存小很多)的数据 ...
- 学习ELK日志平台(五)
ELK Stack 通常情况下: 1,开发人员是不能登录线上服务器查看日志信息 2,各个系统的日志繁多,日志数据分散难以查找 3,日志数据量较大,查询速度慢,数据不够实时性 4,一个调用会涉及到多个系 ...
- ES6技术之“判空方案”
一.常用方案 直接判断 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- 自定义XML文件模板步骤
- 学习HTML5 history API
html5 在 history 对象上添加几个新的方法.事件.属性,用以增强开发者对于浏览器历史记录的控制.大体上说,新的API可以帮助我们在无刷新的情况下改变浏览器的url,新增或者替换之前的历史记 ...
- SVG Sprite 入门(SVG图标解决方案)
关于浏览器图标解决方案,一直就有很多 CSS Sprite,Icon Font,CSS Icon以及SVG.相对而言svg矢量图标以及支持浏览器自身解析的优点,很多团队都已经在使用了.这篇文章主要说明 ...