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

如何在没有删除数据库权限的情况下从命令行中删除所有MySQL表?,mysql,command-line,sql-drop,Mysql,Command Line,Sql Drop,如何使用命令提示符删除Windows MySQL中的所有表?我想这样做的原因是,我们的用户有权删除数据库,但无权重新创建数据库本身,因此我们必须手动删除表。有没有办法一次把所有桌子都放下?请记住,大多数表都与外键链接,因此必须按特定顺序删除它们。您可以删除数据库,然后使用以下命令重新创建它:- mysql> drop database [database name]; mysql> create database [database name]; 您可以生成如下语句:删除表t1、t

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

您可以删除
数据库,然后使用以下命令重新创建它:-

mysql> drop database [database name];
mysql> create database [database name];

您可以生成如下语句:
删除表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; 

接受的答案不适用于具有大量表的数据库,例如Drupal数据库。相反,请参见此处的脚本:
它在MySQL 5.5上运行。注意:在第11行附近,有一个“WHERE table_schema=schema();”应该改为“WHERE table_schema=‘插入将发生导入的数据库的名称’;”

@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;
如果您已经通过添加至少一个不存在的“虚拟”表删除了数据库中的所有表,则此脚本不会引发结果为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;
它假定您从要删除的数据库运行脚本。或者在以下时间之前运行此操作:

USE REPLACE_WITH_DATABASE_NAME_YOU_WANT_TO_DELETE;
感谢Steve Horvath发现回执问题。

试试这个

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

mysqldump-u[用户名]-p[密码]\
--添加删除表--无数据[数据库]|\
grep-e“^DROP\”外键检查“|\
mysql-u[用户名]-p[密码][数据库]


为了克服外键检查的影响,在生成的脚本末尾添加
show table
,并运行多次,直到
show table
命令生成一个空集。

在OP似乎要求从命令提示符而不是从MySQL中删除所有表之前,有人问过类似的问题(正如在相关问题上),因此我认为它不是重复的。另请参见:。所有链接的问题都与此问题不同。此问题不是重复的!2年前提出此问题,但仍然认为它不是重复的问题,主要是因为大多数其他答案只是删除数据库并重新创建它。不过,有人明确表示不希望o删除数据库本身正如我所说,用户没有创建数据库的权限,我们所能做的就是创建、更新、删除表。此解决方案也不正确,以防您的数据库有某些特定的配置,如编码、权限等。使用起来很危险。您还可能会丢失忘记更改的数据库设置ck…有史以来最简单的选择。可以在运行此功能之前使用“show create database database_name”。这需要进行一些调整,因为它无法删除受键约束的表。如果我们将FOREIGN_KEY_CHECKS设置为0,并且确实将FOREIGN_KEY_CHECKS设置为1,则效果良好。删除后,这将允许我们删除所有表,而无需进行键检查s、 注意:可能还需要增加
GROUP_CONCAT_MAX_LEN
,并使用
GROUP_CONCAT(“`',table_schema,`.`',table_name,`')
。CONCAT“DROP table”必须包括“IF EXIST”,这减少了我的时间。这不是最佳解决方案。@Kostonos用此命令修复了一个重要问题,并编辑了Devart的答案,但未被接受。请参阅此页上Kostanos的答案。()实际上,它确实会引发一个错误。请您更具体一点好吗?您遇到了哪一个错误?对于过于谨慎的问题,在上面最后一次选择之后,
SELECT@tables\G
将为您提供一个将要删除的内容的列表-请在执行下半部分之前查看它snippet@SteveHorvath感谢您向backtic指出这个问题我修复了这个查询,现在它在(组、选择和其他表)中运行得非常好这是一个正确的答案。我希望我能投两次票。非常简单,在AWS Beanstalk这样的环境中,一切都来自于环境变量。只要
mysqldump-h$RDS\u主机名-u$RDS\u用户名-p$RDS\u密码-add drop table-无数据$RDS\u DB\u NAME | grep-e'^drop\\外键检查'| mysql-h$RDS\u主机名E-u$RDS\u USERNAME-p$RDS\u PASSWORD$RDS\u DB\u NAME
一个非常简洁的解决方案喜欢这个想法。用户可以访问的所有数据库都是一样的:
mysqldump--host=127.0.0.1--all数据库--user=$mysql\u user--PASSWORD=$mysql\u PASSWORD--add drop表--无数据| grep-E'^drop\\外键检查|使用| mysql--host=127.0.0.1--user=$mysql\u user--password=$mysql\u password
顺便说一句,如果要进行Drupal开发,最简单的方法是使用drush命令行工具