原理: 通过存储过程遍历获取指定数据库的表名称,然后执行删除语句,删除完成后将删除该存储过程。
默认删除为当前使用的数据库,可在第一行SET @table_schema = null
指定其他要删除的数据库。
请务必确保数据的可操作性,使用所带来的一切后果自负。
完整代码如下
SET @table_schema = null; #指定当前要删除所有表的数据库名称,为null或''时默认为当前数据库,反之为指定的数据库
DROP PROCEDURE IF EXISTS dropAllTables;
##删除指定数据库的所有表##
CREATE PROCEDURE dropAllTables(in current_table_schema VARCHAR(255))
BEGIN
#current_table_schema为数据库名称
DECLARE delete_text VARCHAR(255);
DECLARE delete_total INT;
##创建接收游标数据的变量
DECLARE current_table_name VARCHAR(255);
#创建结束标志变量
DECLARE done INT DEFAULT false;
#创建游标
DECLARE cursor_index CURSOR FOR SELECT table_name FROM information_schema.tables
WHERE table_schema = current_table_schema;
#指定游标循环结束时的返回值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;
#设置初始值
SET delete_total = 0;
SET delete_text = '删除执行完成';
IF (current_table_schema is null or current_table_schema = "") THEN
SELECT database() INTO current_table_schema;
END IF;
#打开游标
OPEN cursor_index;
#开始循环游标里的数据
read_loop:loop
#根据游标当前指向的一条数据
FETCH cursor_index INTO current_table_name;
#判断游标的循环是否结束
IF done THEN
LEAVE read_loop; #跳出游标循环
END IF;
#获取一条数据时,进行累加操作
SET delete_total = delete_total + 1;
#执行删除表操作
SET @select_drop = CONCAT(' DROP TABLE IF EXISTS `', current_table_schema, "`.", current_table_name);
PREPARE pr FROM @select_drop;
EXECUTE pr; #执行pr
DROP PREPARE pr;
SELECT @select_drop as drop_sql;
#结束游标循环
END LOOP;
#关闭游标
CLOSE cursor_index;
IF (delete_total = 0) THEN
SET delete_text = '当前未删除任何表';
END IF;
SELECT current_table_schema as delete_database, delete_text, delete_total;
END;
CALL dropAllTables(@table_schema);
DROP PROCEDURE IF EXISTS dropAllTables;