问题:

开发时有时候需要对很多表进行操作。

例如:清空(删除)所有(某些)表,删除所有表某时间点之后导入的数据(类似于回滚)

解决方式:

  对选定的表集合执行相同的查询条件(可为空),如果这个执行结果大于阈值,则使用相同的条件组建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语句生成的存储过程的更多相关文章

  1. insert语句生成的存储过程

    问题: 1.如何配置数据库数据: 方式一:图形界面点击输入数据,导出成sql. 缺点:表多,数据多的时候非常繁琐,字段含义需要另外开窗口对照. 方式二:徒手写或者修改已有语句:insert table ...

  2. SQL 语句调用这个存储过程,生成顺序编码

    一直很讨厌存储过程,没想到今天帮了我大忙啊,或许会因为今天让我慢慢喜欢上存储过程吧,不多说了,切入正题 在使用数据库的时候,难免要在使用过程中进行删除的操作,如果是使用int类型的字段,令其自增长,这 ...

  3. truncate,delete,drop的异同点

    说明:本文摘自oracle技术用户讨论组 truncate,delete,drop的异同点  注意:这里说的delete是指不带where子句的delete语句    相同点:truncate和不带w ...

  4. sql 删除表格delete drop truncate 区别(转)

    (1)   DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作.TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把 ...

  5. (转)iOS sqlite :truncate/delete/drop区分

    转自:http://blog.sina.com.cn/s/blog_6755689f0101fofb.html 相同点: 1.truncate和不带where子句的delete.以及drop都会删除表 ...

  6. delete drop truncate

    一.相同点 1 truncate.不带where子句的delete.drop都会删除表内的数据2 drop.truncate都是DDL语句(数据定义语言),执行后会自动提交 二.不同点 1trunca ...

  7. sql 删除表数据truncate delete drop的区别

    已下内容为转载内容:学习之用 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL语句(数据定义语言),执行后会自动提交. ...

  8. PLSQL_标准删除的方式Delete/Drop/Truncate区别和比较(概念)

    2014-06-02 Created By BaoXinjian

  9. SQL truncate/delete/drop 区别

    相同点 1. truncate 和不带 where 子句的 delete 以及 drop 都会删除表内的数据. 2. drop/truncate 都是 DDL 语句(数据定义语言),执行后会自动提交. ...

随机推荐

  1. 学习ELK日志平台(五)

    ELK Stack 通常情况下: 1,开发人员是不能登录线上服务器查看日志信息 2,各个系统的日志繁多,日志数据分散难以查找 3,日志数据量较大,查询速度慢,数据不够实时性 4,一个调用会涉及到多个系 ...

  2. 遇到MyBatis-Plus的错误之“Table 'mybatis_plus.user' doesn't exist”

    一.问题 Table 'mybatis_plus.user' doesn't exist 二.原因 表中没有user表 三.解决方案 生成user表既可 四.结果图 运行后显示查询出来的数据 五.总结 ...

  3. DevEco Device Tool 3.0 Release 新版本发布,支持多人共享开发

    DevEco Device Tool 是面向智能设备开发者提供的一站式集成开发环境,支持 HarmonyOS Connect 的组件按需定制,支持代码编辑.编译.烧录和调试.性能监测等功能,支持 C/ ...

  4. 纯干货数学推导_傅里叶级数与傅里叶变换_Part5_从傅里叶级数推导傅里叶变换

  5. .net大作业

    登录页面: 源代码:当下较忙,后续会传至github上

  6. echarts中饼图的legend自定义icon图片(扇形为例)

    效果图: 代码: 问题:// icon: "pin", // 这个字段控制形状 类型包括 circle,rect ,roundRect,triangle,diamond,pin,a ...

  7. springboot集成spring security安全框架入门篇

    一. :spring security的简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下 ...

  8. Intel主板芯片组

    写这个的初衷还是由于linux内核本身就是硬件的抽象,如果你对硬件的相关发展,机制以及架构不了解,实际你也是看不懂linux内核代码以及看不懂linux很多命令输出的结果的,如果你看内核代码就会发现内 ...

  9. nfs客户端的一次处理

    为什么要说这个呢,由于节点环境不一致,导致在重建pod时,我们暂且叫该pod为 cxpod,cxpod所在宿主机出现了问题现象如下:一.cxpod始终处于创建中 ContainerCreating [ ...

  10. LevelDB 学习笔记1:布隆过滤器

    LevelDB 学习笔记1:布隆过滤器 底层是位数组,初始都是 0 插入时,用 k 个哈希函数对插入的数字做哈希,并用位数组长度取余,将对应位置 1 查找时,做同样的哈希操作,查看这些位的值 如果所有 ...