MySQL 快速清空数据库

项目中使用了 InnoDB 引擎, 测试的时候, 使用的数据因为主键的唯一性和外键约束等问题, 导出和导入很是麻烦.

于是想到了写一个能快速清空数据的存储过程.

注意: 清空表数据使用了 TRUNCATE, 如果你的数据太多, 可能会非常慢!

另外: 我也不是什么 DBA, 不能保证脚本的稳定性.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
DELIMITER //

CREATE PROCEDURE `test`.`CLEANDB` (_db_name VARCHAR(10))
BEGIN
# 结束符号
DECLARE _done BOOL DEFAULT false;

# 表名
DECLARE _table_name VARCHAR(45);
# 光标指向系统表中指定数据库的表名
DECLARE _cur CURSOR FOR
SELECT `TABLE_NAME`
FROM `information_schema`.`TABLES`
WHERE `TABLE_SCHEMA`=_db_name;

# 异常处理, 当光标达到最末时设置结束符号为真.
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = true;

# 打开光标
OPEN _cur;

REPEAT
# 从光标中取出一行
FETCH _cur INTO _table_name;
# 拼接 SQL 语句
SET @truncate_sqlstring = CONCAT('TRUNCATE `', _db_name, '`.`', _table_name, '`;');
# 预处理 SQL 语句
PREPARE _truncate_table FROM @truncate_sqlstring;
# 执行 SQL 语句
EXECUTE _truncate_table;
# 如果结束符号为真则退出循环
UNTIL _done END REPEAT;

# 关闭光标
CLOSE _cur;

END//