mysql刪庫跑路小指令碼——用儲存過程刪除全部表(不刪除資料庫)
阿新 • • 發佈:2019-02-12
建立儲存過程指令碼
DELIMITER $$ CREATE PROCEDURE `drop_all_tables`() BEGIN DECLARE count INT; DECLARE tb VARCHAR(200); DECLARE dbname VARCHAR(200) DEFAULT DATABASE(); DECLARE tbnames cursor FOR SELECT CONCAT('DROP TABLE `',dbname,'`.`',table_name,'`') FROM information_schema.tables WHERE table_schema = dbname; SELECT count(*) INTO count FROM information_schema.tables WHERE table_schema = dbname; OPEN tbnames; loop_i:LOOP IF count = 0 THEN LEAVE loop_i; END IF; FETCH tbnames INTO tb; SET @tb = tb; PREPARE stmt FROM @tb; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET count = count - 1; END LOOP; CLOSE tbnames; END$$ DELIMITER ;
使用時呼叫儲存過程
call drop_all_tables();
mysql命令列下效果:
mysql> use test;# 要建立在指定的資料庫中才能被呼叫到 Database changed mysql> DELIMITER $$ mysql> CREATE PROCEDURE `drop_all_tables`() -> BEGIN -> DECLARE count INT; -> DECLARE tb VARCHAR(200); -> DECLARE dbname VARCHAR(200) DEFAULT DATABASE(); -> DECLARE tbnames cursor FOR SELECT CONCAT('DROP TABLE `',dbname,'`.`',table_name,'`') FROM information_schema.tables WHERE table_schema = dbname; -> SELECT count(*) INTO count FROM information_schema.tables WHERE table_schema = dbname; -> OPEN tbnames; -> loop_i:LOOP -> IF count = 0 THEN -> LEAVE loop_i; -> END IF; -> FETCH tbnames INTO tb; -> SET @tb = tb; -> PREPARE stmt FROM @tb; -> EXECUTE stmt; -> DEALLOCATE PREPARE stmt; -> SET count = count - 1; -> END LOOP; -> CLOSE tbnames; -> END$$ Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER ; mysql> call drop_all_tables(); Query OK, 1 row affected (0.00 sec)