如何在不删除数据库的情况下删除MySQL数据库中的所有表?


12

我需要将所有表拖放到数据库中,而无需事先知道它们的名称。典型的过程是删除然后重新创建数据库,但这不是一个选择。最好的方法是什么?


1
可能应该事先询问这个问题,但迟到总比我想像的要好:什么操作系统?
杰夫·斯尼德

Unix / Linux之类的OS。
蒋安

Answers:


18

有一个更简单的使用mysqldump的bash一线式(来自Thingy Ma Jig Blog)。

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]

现在,它忽略了约束。



3

您也可以尝试使用快速Shell脚本来执行此操作:

#!/bin/bash

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

echo在检查完将要执行的操作后,将其删除。


顺便说一句,为什么在IFS的值前写“ $”?为什么看起来不像“ IFS ='\ n'”?
kolypto

@o_OTync Using $''使bash解释反斜杠序列,而不是直接使用它们。 '\n'恰好包含\ n,就像这样,$IFS它将理解为拆分为\和n个字符。 $'\n'将包含换行符0x0D。在这里查看更多信息:gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting
杰夫·斯尼德

我认为这比使用INFORMATION_SCHEMA更简单。
蒋介石

0

有一个在Xaprb博客条目最近这很好地涵盖了这一点。

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

尝试以下方法mk-find

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

如果您对结果满意,则:

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

-2

如果您具有文件系统访问权限,则只需rm -rf databasename/*:)。

Drop数据库语句执行相同的操作... MySQL手册摘录:

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


2
对于任何不重要的设置,这是一个非常糟糕的主意,因为MySQL并不期望这些文件突然消失,并且可能处于任何数量的操作,事务,复制,锁定的中间……
bot403

您是否会考虑修改答案以包括适当的命令和程序呢?
bot403 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.