问题:

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

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

解决方式:

  对选定的表集合执行相同的查询条件(可为空),如果这个执行结果大于阈值,则使用相同的条件组建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. 1 -- -- powered by wanglifeng https://www.cnblogs.com/wanglifeng717
  2. 2 DROP PROCEDURE IF EXISTS delete_drop_sql_generator;
  3. 3 DELIMITER %%
  4. 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. 5 label:BEGIN
  6. 6
  7. 7 /*------------每个表使用同样的过滤条件---------------------------------*/
  8. 8 /*
  9. 9 -- -- powered by wanglifeng https://www.cnblogs.com/wanglifeng717
  10. 10 适用场景:
  11. 11 1.将所有表2021-08-01日插入的记录全部删除。例如刚配置业务数据全部删除,只要确定某个时间段,只有你的数据在里面
  12. 12
  13. 13 2.将某些表相同字段的记录删除,自定义哪些表,必须同时含有where条件中的字段。
  14. 14 */
  15. 15 DROP TABLE if exists temp_filter_table;
  16. 16 DROP TABLE if exists temp_var_query_table;
  17. 17 CREATE table temp_var_query_table(tbl_name VARCHAR(512));
  18. 18
  19. 19 /*-----------------------------------------------------------------------------*/
  20. 20 -- ----------配置项目-----------
  21. 21 -- -- powered by wanglifeng https://www.cnblogs.com/wanglifeng717
  22. 22 /*-----------------------------------------------------------------------------*/
  23. 23 SET @var_where = var_where;
  24. 24 -- "LEFT(create_time,19)>'2021-08-04'";-- 格式:2021-08-11 16:32:37.872
  25. 25 -- select @var_where;
  26. 26
  27. 27 -- 如果含有include,则已include为准。
  28. 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. 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. 30 -- 如果包含和不含字段都是为空,将库中所有的表加入进去。
  31. 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. 32 else
  33. 33 -- 如果include为空,但是exclude不为空
  34. 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. 35 PREPARE stmt FROM @exec_sql;
  36. 36 EXECUTE stmt;
  37. 37 DEALLOCATE PREPARE stmt;
  38. 38 END if;
  39. 39 ELSE
  40. 40 -- 插入静态字段
  41. 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. 42 PREPARE stmt FROM @exec_sql;
  43. 43 EXECUTE stmt;
  44. 44 DEALLOCATE PREPARE stmt;
  45. 45 END if;
  46. 46
  47. 47 -- select @exec_sql;
  48. 48
  49. 49 -- 自定义查找,如果自定义查找,请注释掉上面默认的全库查找
  50. 50
  51. 51 -- INSERT INTO temp_query_table VALUES ('tbl_act_class'), ('tbl_act_info');
  52. 52
  53. 53
  54. 54 /*-----------------------------------------------------------------------------*/
  55. 55 /*---------------------配置项结束--------------------------------------*/
  56. 56 -- -- powered by wanglifeng https://www.cnblogs.com/wanglifeng717
  57. 57 /*-----------------------------------------------------------------------------*/
  58. 58
  59. 59
  60. 60 SET group_concat_max_len = 4294967295;
  61. 61
  62. 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. 63 SET @query_code='
  64. 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. 65 ';
  66. 66 SELECT REPLACE(@query_code,'@var_where',@var_where) INTO @query_code;
  67. 67
  68. 68 SELECT GROUP_CONCAT(
  69. 69 t.temp SEPARATOR '\r\n union all \r\n') INTO @var_query_sql
  70. 70 FROM
  71. 71 (
  72. 72 SELECT
  73. 73 REPLACE(@query_code,'@tbl_name',t.TABLE_NAME) as temp
  74. 74 FROM information_schema.tables t
  75. 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. 76 ) t;
  77. 77
  78. 78 -- select @var_query_sql;
  79. 79
  80. 80 SET @exe_sql = @var_query_sql;
  81. 81 PREPARE stmt FROM @exe_sql;
  82. 82 EXECUTE stmt;
  83. 83 DEALLOCATE PREPARE stmt;
  84. 84
  85. 85
  86. 86 -- 组成建表语句
  87. 87 /*create table temp_var_tbl_name as
  88. 88 select t.tbl_name from
  89. 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. 90 union all
  91. 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. 92 ) t where t.num>=1;
  93. 93 */
  94. 94
  95. 95 DROP TABLE if exists temp_filter_table;
  96. 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. 97
  98. 98 PREPARE stmt FROM @exe_sql;
  99. 99 EXECUTE stmt;
  100. 100 DEALLOCATE PREPARE stmt;
  101. 101
  102. 102 -- select @exe_sql;
  103. 103
  104. 104
  105. 105
  106. 106 SELECT CONCAT(
  107. 107 'SET FOREIGN_KEY_CHECKS = 0;',
  108. 108 '\r\n',
  109. 109 GROUP_CONCAT(
  110. 110 CONCAT('drop table ',' ',tbl_name,'; ')
  111. 111 SEPARATOR '\r\n'
  112. 112 ),
  113. 113 '\r\n',
  114. 114 'SET FOREIGN_KEY_CHECKS = 1;'
  115. 115 ) INTO @drop_sql_code
  116. 116 FROM temp_filter_table;
  117. 117
  118. 118 SELECT CONCAT(
  119. 119 'SET FOREIGN_KEY_CHECKS = 0;',
  120. 120 '\r\n',
  121. 121 GROUP_CONCAT(
  122. 122 CONCAT_WS('','delete from ',tbl_name,' ',@var_where,';')
  123. 123 SEPARATOR '\r\n'
  124. 124 ),
  125. 125 '\r\n',
  126. 126 'SET FOREIGN_KEY_CHECKS = 1;'
  127. 127 ) INTO @delete_sql_code
  128. 128 FROM temp_filter_table;
  129. 129
  130. 130 SELECT CONCAT(
  131. 131 'SET FOREIGN_KEY_CHECKS = 0;',
  132. 132 '\r\n',
  133. 133 GROUP_CONCAT(
  134. 134 CONCAT_WS('','select * from ',tbl_name,' ',@var_where,';')
  135. 135 SEPARATOR '\r\n'
  136. 136 ),
  137. 137 '\r\n',
  138. 138 'SET FOREIGN_KEY_CHECKS = 1;'
  139. 139 ) INTO @select_sql_code
  140. 140 FROM temp_filter_table;
  141. 141
  142. 142 SELECT '代码','作用' LIMIT 0
  143. 143 UNION ALL
  144. 144 SELECT @select_sql_code ,'查询语句'
  145. 145 UNION ALL
  146. 146 SELECT @delete_sql_code,'删除语句'
  147. 147 UNION ALL
  148. 148 SELECT @drop_sql_code ,'drop表语句';
  149. 149
  150. 150 DROP TABLE if exists temp_filter_table;
  151. 151 DROP TABLE if exists temp_var_query_table;
  152. 152 END %%
  153. 153 DELIMITER ;
  154. 154
  155. 155 -- SELECT * from temp_var_query_table;
  156. 156
  157. 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. 1 -- 生成删除所有存储过程和函数的语句
  2. 2 -- -- powered by wanglifeng https://www.cnblogs.com/wanglifeng717
  3. 3 DELIMITER $$
  4. 4 DROP PROCEDURE IF EXISTS `print_drop_all_proc_sql`$$
  5. 5 CREATE PROCEDURE `print_drop_all_proc_sql`(in_dbname VARCHAR(200))
  6. 6 BEGIN
  7. 7 DECLARE var_count INT;
  8. 8 DECLARE var_name VARCHAR(200);
  9. 9 DECLARE var_type VARCHAR(200);
  10. 10
  11. 11 -- 获取所有的存储过程和函数
  12. 12 DECLARE pro_funcs CURSOR FOR SELECT routine_name,routine_type FROM information_schema.routines WHERE routine_schema = in_dbname;
  13. 13 SELECT COUNT(*) INTO var_count FROM information_schema.Routines WHERE routine_schema = in_dbname;
  14. 14 OPEN pro_funcs;
  15. 15 SET FOREIGN_KEY_CHECKS = 0;
  16. 16 SET @pro_func=NULL;
  17. 17 loop_i:LOOP
  18. 18 IF var_count = 0 THEN
  19. 19 LEAVE loop_i;
  20. 20 END IF;
  21. 21 FETCH pro_funcs INTO var_name,var_type;
  22. 22 -- 必须用concat_ws,不然有null,拼出来全部是空。char(10)或者“\r\n都可以”
  23. 23 SET @pro_func=CONCAT_WS('',@pro_func,' drop ',var_type, ' `',in_dbname,'`.`',var_name,'`;',"\r\n");
  24. 24
  25. 25 SET var_count = var_count - 1;
  26. 26 END LOOP;
  27. 27 CLOSE pro_funcs;
  28. 28 SET FOREIGN_KEY_CHECKS = 1;
  29. 29 SELECT @pro_func;
  30. 30 END$$
  31. 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. docker安装部署、fastDFS文件服务器搭建与springboot项目接口

    一.docker安装部署 1.更新yum包:sudo yum update 2.安装需要的软件包,yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动 ...

  2. scrapy--使用案例

    1.scrapy框架 1.1 安装scrapy pip3 install wheel 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twis ...

  3. ubuntu vmware kernel module updater

    Ubuntu 19.04 - VMWare内核模块更新程序问问题 4 3我运行了这个命令: apt-cache search linux-headers-$(uname -r)它返回输出 linux- ...

  4. 结合CSS3的布局新特征谈谈常见布局方法

    写在前面最近看到<图解CSS3>的布局部分,结合自己以前阅读过的一些布局方面的知识,这里进行一次基于CSS2.3的各种布局的方法总结. 常见的页面布局 在拿到设计稿时,作为一个前端人员,我 ...

  5. 微信小程序实时通讯(websocket)问题

    这几天值班忙的不要不要,人工智能这块看的都是零零散散,今天就来写写小程序的实时通讯吧.小程序端://这个是连接 lianjie:function(){ var socketOpen = false / ...

  6. Python窗口学习之浅尝按键触发事件

    一.窗口上敲键盘触发事件(以Enter键为例) 二.点击窗口按钮触发事件(以鼠标左键双击为例) 代码: import tkinter as tk root = tk.Tk() root.geometr ...

  7. PAT A1001 A+B Format

    Calculate a+b and output the sum in standard format -- that is, the digits must be separated into gr ...

  8. 三种获取数据的方法fetch和ajax和axios

    一 .fetch用法 ( 本人比较喜欢fetch,代码精简,虽说目前axios比较流行,但是fetch很多大厂已经开始用fetch开始封装了, 我觉得以后fetch会取代axios和ajax ) 1. ...

  9. jboss 7.1.1.final 报错 set the maxParameterCount attribute on the Connector

    Therefore, I cannot just add the connector attribute in standalone.xml like so: 在 <JBOSS_HOME> ...

  10. vue中判断页面滚动开始和结束

    参考链接:https://www.jianshu.com/p/adad39705ced    和  https://blog.csdn.net/weixin_44309374/article/deta ...