如何在没有DROP数据库权限的情况下从命令行中删除所有MySQL表?

Man*_*tas 212 mysql command-line sql-drop

如何使用命令提示符删除Windows MySQL中的所有表?我想这样做的原因是我们的用户可以访问数据库drop,但是没有权限重新创建数据库本身,因此我们必须手动删除表.有没有办法一次性删除所有表?请记住,大多数表都与外键链接,因此必须按特定顺序删除它们.

Dev*_*art 299

您可以生成如下语句:DROP TABLE t1, t2, t3, ...然后使用预准备语句来执行它:

SET FOREIGN_KEY_CHECKS = 0; 
SET @tables = NULL;
SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables
  FROM information_schema.tables 
  WHERE table_schema = 'database_name'; -- specify DB name here.

SET @tables = CONCAT('DROP TABLE ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1; 
Run Code Online (Sandbox Code Playgroud)

  • 如果我们SET FOREIGN_KEY_CHECKS = 0,这可以正常工作; 并执行SET FOREIGN_KEY_CHECKS = 1; 删除后,这将允许我们删除所有表而无需进行密钥检查; (13认同)
  • 这不是最好的解决方案.@Kostonos修复了这个命令的一个重要问题并编辑了Devart的答案,但是没有被接受.请在此页面上查看Kostanos的回答.(http://stackoverflow.com/a/18625545/114558) (11认同)
  • 注意也可能需要增加`GROUP_CONCAT_MAX_LEN`并使用``GROUP_CONCAT('`',table_schema,'``',table_name,'`')``来转义模式和名称. (10认同)
  • 这需要一些调整,因为它不能删除受键约束的表 (6认同)
  • CONCAT"DROP TABLE"必须包含"IF EXIST",这已经减少了我的时间. (4认同)

Kos*_*nos 268

@ Devart的版本是正确的,但这里有一些改进以避免出错.我编辑了@ Devart的答案,但是没有被接受.

SET FOREIGN_KEY_CHECKS = 0;
SET GROUP_CONCAT_MAX_LEN=32768;
SET @tables = NULL;
SELECT GROUP_CONCAT('`', table_name, '`') INTO @tables
  FROM information_schema.tables
  WHERE table_schema = (SELECT DATABASE());
SELECT IFNULL(@tables,'dummy') INTO @tables;

SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
Run Code Online (Sandbox Code Playgroud)

如果已经通过添加至少一个不存在的"虚拟"表删除了数据库中的所有表,则此脚本不会引发NULL结果的错误.

如果您有很多桌子,它会修复.

这个小的更改删除所有视图存在于数据库中

SET FOREIGN_KEY_CHECKS = 0;
SET GROUP_CONCAT_MAX_LEN=32768;
SET @views = NULL;
SELECT GROUP_CONCAT('`', TABLE_NAME, '`') INTO @views
  FROM information_schema.views
  WHERE table_schema = (SELECT DATABASE());
SELECT IFNULL(@views,'dummy') INTO @views;

SET @views = CONCAT('DROP VIEW IF EXISTS ', @views);
PREPARE stmt FROM @views;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
Run Code Online (Sandbox Code Playgroud)

它假定您从要删除的数据库中运行脚本.或者之前运行:

USE REPLACE_WITH_DATABASE_NAME_YOU_WANT_TO_DELETE;
Run Code Online (Sandbox Code Playgroud)

感谢Steve Horvath用反引号发现问题.

  • 对于过于谨慎的,在上面的最后一个SELECT之后的`SELECT @tables\G`会给你一个将要删除的内容列表 - 在执行代码片段的后半部分之前查看它 (3认同)
  • 这是正确的答案 (2认同)

Mut*_*esh 75

试试这个.

这适用于具有约束的表(外键关系).或者,您可以删除数据库并重新创建,但您可能没有必要的权限来执行此操作.

mysqldump -u[USERNAME] -p[PASSWORD] \
  --add-drop-table --no-data [DATABASE] | \
  grep -e '^DROP \| FOREIGN_KEY_CHECKS' | \
  mysql -u[USERNAME] -p[PASSWORD] [DATABASE]
Run Code Online (Sandbox Code Playgroud)

为了克服外键检查效果,请show table在生成的脚本末尾添加并运行多次,直到show table命令导致空集.


use*_*159 45

你可以放下database,然后重新创建与它下面: -

mysql> drop database [database name];
mysql> create database [database name];
Run Code Online (Sandbox Code Playgroud)

  • 正如我所说,用户无权创建数据库,我们所能做的就是创建,更新,删除表 (23认同)
  • 如果你的数据库有一些特殊的配置,比如编码,权限等,这个解决方案也是不正确的. (22认同)
  • 使用危险.您还可以放弃忘记检查的数据库设置... (6认同)
  • 可以在运行之前使用“show create数据库database_name” (2认同)

Gil*_*s B 6

接受的答案不适用于具有大量表的数据库,例如Drupal数据库.相反,请参阅此处的脚本:https://stackoverflow.com/a/12917793/1507877 ,它可以在MySQL 5.5上运行.注意:在第11行附近,有一个"WHERE table_schema = SCHEMA();" 这应该是"WHERE table_schema ='INSERT NAME of DB INTO进口将发生';"

  • 顺便说一句,如果要进行Drupal开发,真正简单的方法是使用drush命令行工具。命令是:drush sql-drop (2认同)