最省事的是drop database再重建,但需保留表结构时应动态生成truncate table语句:先禁用外键检查,查询information_schema.tables拼接语句,再启用外键检查并执行。

直接执行 DROP DATABASE 再重建是最省事的,但如果你必须保留表结构(比如有外键约束、触发器、注释或权限依赖),那就得逐表清空——而手动写 TRUNCATE TABLE 几十张表太傻,用脚本生成才是正解。
为什么不能直接用 TRUNCATE TABLE 列表?
MySQL 的 TRUNCATE TABLE 不支持通配符或批量表名,而且它会重置自增主键、无法在有外键引用的表上直接执行(报错 ERROR 1701 (HY000))。硬写几十条语句易漏、难维护,还容易因顺序错导致外键冲突。
-
TRUNCATE比DELETE FROM快,但会隐式提交,不可回滚 - 外键开启时(
FOREIGN_KEY_CHECKS = 1),TRUNCATE会失败,哪怕目标表没被引用,只要库中存在外键关系就可能拦住 - 视图、存储过程、函数不会被清空,但脚本里不处理它们——这正好是你想要的“只清数据”
用 SELECT CONCAT(...) 动态生成清空语句
核心思路:查出当前库所有基础表(排除视图),拼成 TRUNCATE TABLE `db`.`table`; 语句,再一次性执行。关键是要关外键检查、按依赖顺序处理(其实简单清空可绕过顺序,直接关检查就行)。
SET FOREIGN_KEY_CHECKS = 0;
SELECT CONCAT('TRUNCATE TABLE `', table_schema, '`.`', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'your_db_name'
AND table_type = 'BASE TABLE';
SET FOREIGN_KEY_CHECKS = 1;
把上面结果复制出来,粘贴到客户端执行;或者用 MySQL 客户端加 -e 和重定向自动执行(见下一条)。
一行命令全自动执行(Linux/macOS)
避免复制粘贴出错,用 shell 把生成和执行串起来。注意:必须用 mysql -N -s 去掉列头和表格边框,否则会语法错误。
- 替换
your_db_name、your_user、your_pass、your_host -
mysql -N -s输出纯文本,mysql -e执行语句 - 外键开关必须包裹在同一个连接内,所以用
-e连续执行多条
mysql -u your_user -pyour_pass -h your_host -N -s -e "
SET FOREIGN_KEY_CHECKS=0;
SELECT CONCAT('TRUNCATE TABLE \`', table_schema, '\`.\`', table_name, '\`;')
FROM information_schema.tables
WHERE table_schema='your_db_name' AND table_type='BASE TABLE';
SET FOREIGN_KEY_CHECKS=1;" | mysql -u your_user -pyour_pass -h your_host
真正麻烦的不是生成语句,而是你忘了 information_schema.tables 默认不包含系统库,但如果你的 your_db_name 有同名临时表或分区表残留,table_type = 'BASE TABLE' 这个条件就得核对清楚——不然某张表会漏掉,或者误删了不该动的表。











