如何删除MySQL数据库中的所有表而不删除数据库?

我需要事先不知道他们的名字,把所有的表放在数据库中。 典型的过程是删除然后重新创build数据库,但这不是一个选项。 什么是最好的办法呢?

有一个简单的bash 单线程使用mysqldump(来自Thingy Ma Jig博客 )。

mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP | mysql -u[USERNAME] -p[PASSWORD] [DATABASE] 

如果你得到这个错误:

 ERROR 1217 (23000) at line 1: Cannot delete or update a parent row: a foreign key constraint fails 

尝试以下操作:

 (echo 'SET foreign_key_checks = 0;'; (mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP); echo 'SET foreign_key_checks = 1;') | \ mysql -u[USERNAME] -p[PASSWORD] -b [DATABASE] 

现在它忽略了约束。

您应该使用information_schema表来获取有关数据库的元数据,然后删除列表中的表。

你可以尝试一个快速的shell脚本来做到这一点:

 #!/bin/bash IFS=$'\n' for table in `mysql <databaseName> -N -e 'show tables'`; do echo mysql <databaseName> -e "drop table $table" done 

删除echo后,检查它会做你所期望的。

最近在Xaprb博客上有一个很好的报道 。

它包括了为什么使用INFORMATION_SCHEMA并不总是一件好事,并且引用了Maatkit那些可爱的人的工具。

mk-find试试以下内容:

 mk-find '<database>' --printf 'DROP TABLE %D.%N' 

如果你对结果满意,那么:

 mk-find '<database>' --exec 'DROP TABLE %D.%N' 

如果你有文件系统访问,那么只需rm -rf databasename/* :)。

Drop数据库语句也是一样的…摘自MySQL手册:

DROP DATABASE语句从给定的数据库目录中删除正常操作期间MySQL自身可能创build的文件和目录: