我需要事先不知道他们的名字,把所有的表放在数据库中。 典型的过程是删除然后重新创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的文件和目录: