在平台上线前,会在数据库里写入很多测试数据,到数据库需要正式发布的时候,这些测试的数据必须清理掉。数据库里如果只有几个表到是好说,一条 truncate 命令一个一个清除,但是如果数据库里有成百上千个表,那么这样一个一个的清除既费时也变成了不可能完成的任务了。于是硬着头皮思考能否做成一个通用的存储过程,只需要输入需要清理的数据库名称,就能自动清除所有的测试数据呢?于是打开手册现学现用,用了一晚上时间加google和baidu写了下面这个存储过程,这个存储过程在5.1.44-log MySQL Community Server (GPL)版本测试通过。
清除数据的存储过程内容如下:
CREATE PROCEDURE Clear_DB(
DB_NAME varchar(50) # 数据库名称
)
BEGIN
DECLARE done INT DEFAULT 0; #游标的标志位
DECLARE name varchar(50);
DECLARE cmd varchar(50);
DECLARE tb_name CURSOR FOR SELECT table_name FROM information_schema.TABLES WHERE table_schema=DB_NAME;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN tb_name;
REPEAT
FETCH tb_name INTO name;
IF NOT done THEN
#set cmd=concat('Delete from ',DB_NAME,'.','`',`name`,'`');
set cmd=concat('TRUNCATE table ',DB_NAME,'.','`',`name`,'`'); # 拼删除命令
SET @E=cmd;
PREPARE stmt FROM @E;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
UNTIL done END REPEAT;
CLOSE tb_name;
END;
这个存储过程借鉴了网上一位前辈的例子,只是这位前辈的数据库可能没有包含特殊字符的表名,可是我的数据库有很多包含了特殊字符的表名,所以我在这位前辈的例子上进行了修改,这里特别感谢这位不知姓名的前辈。这个存储过程写的实在是简陋,如果那位网友有更好的,请一定要赐教在下。