【问题标题】:How to remove all MySQL tables from the command-line without DROP database permissions? [duplicate]如何在没有 DROP 数据库权限的情况下从命令行删除所有 MySQL 表? [复制]
【发布时间】:2012-09-06 09:18:04
【问题描述】:

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

【问题讨论】:

  • stackoverflow.com/questions/3476765/…之前也有人问过类似的问题
  • 看来 OP 要求从命令提示符中删除所有表,而不是从 MySQL 中删除(因为它在链接的问题上),所以在我看来它不是重复的。
  • 没有一个链接的问题与这个相同。这个问题不是重复的!
  • 2年前问过这个问题,仍然认为它不是重复的,主要是因为大多数其他答案都是简单地删除数据库并重新创建它。但是,有人明确表示不想删除数据库本身

标签: mysql command-line sql-drop


【解决方案1】:

您可以删除 database,然后使用以下命令重新创建:-

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

【讨论】:

  • 正如我所说的用户没有创建数据库的权限,我们所能做的就是创建,更新,删除表
  • 此解决方案也不正确,以防您的数据库有一些特定配置,如编码、权限等。
  • 使用危险。您还可以放松忘记检查的数据库设置...
  • 有史以来最简单的替代方案。
  • 在运行之前可以使用'show create database database_name'
【解决方案2】:

您可以生成这样的语句: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; 

【讨论】:

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

接受的答案不适用于具有大量表的数据库,例如Drupal 数据库。相反,请参阅此处的脚本:https://stackoverflow.com/a/12917793/1507877 这确实适用于 MySQL 5.5。注意:在第 11 行附近,有一个“WHERE table_schema = SCHEMA();”这应该是“WHERE table_schema = 'INSERT NAME OF DB INTO WHICH IMPORT WILL OCCUR';”

【讨论】:

  • 顺便说一下,如果进行 Drupal 开发,最简单的方法是使用 drush 命令行工具。命令是:drush sql-drop
【解决方案4】:

@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 发现反引号问题。

【讨论】:

  • 其实确实会报错。
  • 您能说得更具体些吗?您遇到了哪个错误?
  • 对于过于谨慎的人,SELECT @tables\G 在上面最后一个 SELECT 之后会给你一个即将被删除的列表 - 在执行 sn-p 的后半部分之前查看它
  • @SteveHorvath 感谢您指出反引号问题。我修复了查询,它现在可以与(组、选择和其他表)完美运行。
  • 这是正确的答案
【解决方案5】:

试试这个。

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

mysqldump -u[USERNAME] -p[PASSWORD] \
  --add-drop-table --no-data [DATABASE] | \
  grep -e '^DROP \| FOREIGN_KEY_CHECKS' | \
  mysql -u[USERNAME] -p[PASSWORD] [DATABASE]

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

【讨论】:

  • 希望我能投票两次。如此简单,并且在 AWS Beanstalk 等环境中运行得非常好,无论如何,一切都来自 env vars。只需mysqldump -h$RDS_HOSTNAME -u$RDS_USERNAME -p$RDS_PASSWORD --add-drop-table --no-data $RDS_DB_NAME | grep -e '^DROP \| FOREIGN_KEY_CHECKS' | mysql -h$RDS_HOSTNAME -u$RDS_USERNAME -p$RDS_PASSWORD $RDS_DB_NAME
  • 一个非常简洁的解决方案
  • 喜欢这个主意。对于用户有权访问的所有数据库,这都是相同的:mysqldump --host=127.0.0.1 --all-databases --user=$mysql_user --password=$mysql_password --add-drop-table --no-data | grep -e '^DROP \| FOREIGN_KEY_CHECKS\|USE' | mysql --host=127.0.0.1 --user=$mysql_user --password=$mysql_password
猜你喜欢
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 2021-12-26
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 2018-06-03
相关资源
最近更新 更多