是否有一个很好的简单的方法来删除MySQL数据库中的所有表,忽略任何外键约束,可能在那里?


当前回答

从http://www.devdaily.com/blog/post/mysql/drop-mysql-tables-in-any-order-foreign-keys:

SET FOREIGN_KEY_CHECKS = 0;
drop table if exists customers;
drop table if exists orders;
drop table if exists order_details;
SET FOREIGN_KEY_CHECKS = 1;

(注意,这回答了如何禁用外键检查,以便能够以任意顺序删除表。它没有回答如何为所有现有的表自动生成drop-table语句,并在一个脚本中执行它们。Jean的回答是。)

其他回答

下面是一种通过bash脚本自动做到这一点的方法:

host=$1
dbName=$2
user=$3
password=$4

if [ -z "$1" ]
then
    host="localhost"
fi

# drop all the tables in the database
for i in `mysql -h$host -u$user -p$password $dbName -e "show tables" | grep -v Tables_in` ; do  echo $i && mysql -h$host -u$user -p$password $dbName -e "SET FOREIGN_KEY_CHECKS = 0; drop table $i ; SET FOREIGN_KEY_CHECKS = 1" ; done

此解决方案基于@SkyLeach答案,但支持删除带外键的表。

echo "SET FOREIGN_KEY_CHECKS = 0;" > ./drop_all_tables.sql
mysqldump --add-drop-table --no-data -u user -p dbname | grep 'DROP TABLE' >> ./drop_all_tables.sql
echo "SET FOREIGN_KEY_CHECKS = 1;" >> ./drop_all_tables.sql
mysql -u user -p dbname < ./drop_all_tables.sql

我对Dion Truter的答案进行了修改,使它更容易使用许多表格:

SET GROUP_CONCAT_MAX_LEN = 10000000;
SELECT CONCAT('SET FOREIGN_KEY_CHECKS=0;\n', 
              GROUP_CONCAT(CONCAT('DROP TABLE IF EXISTS `', table_name, '`')
                           SEPARATOR ';\n'),
              ';\nSET FOREIGN_KEY_CHECKS=1;')
FROM information_schema.tables
WHERE table_schema = 'SchemaName';

这将在一个字段中返回全部内容,因此您可以复制一次并删除所有表(在Workbench中使用复制字段内容(不带引号))。如果有很多表,可能会遇到GROUP_CONCAT()的一些限制。如果是这样,增加max len变量(如果需要,还有max_allowed_packet)。

目前为止对我来说最好的解决方案

选择数据库->右键单击->任务->生成脚本-将打开生成脚本的向导。在set Scripting选项中选择对象后,单击高级按钮。在“脚本删除和创建”下选择脚本删除。

运行脚本。

在像bash/zsh这样的Linux shell中:

DATABASE_TO_EMPTY="your_db_name";
{ echo "SET FOREIGN_KEY_CHECKS = 0;" ; \
  mysql "$DATABASE_TO_EMPTY" --skip-column-names -e \
  "SELECT concat('DROP TABLE IF EXISTS ', table_name, ';') \
   FROM information_schema.tables WHERE table_schema = '$DATABASE_TO_EMPTY';";\
  } | mysql "$DATABASE_TO_EMPTY"

这将生成命令,然后立即将它们输送到第二个客户端实例,该实例将删除表。

聪明的部分当然是从这里的其他答案复制的-我只是想要一个复制-粘贴的一行程序来实际完成OP想要的工作。

当然,你也必须在这些mysql命令中输入你的凭证(两次),除非你有一个非常低的安全设置。(或者你可以用mysql命令的别名来包含你的学分。)