删除与某些通配符匹配的MySQL数据库?

时间:2009-01-19 06:50:12

标签: mysql sql

我在服务器中运行mySQL,我需要丢弃大量数据库(在使用服务器进行一些测试之后)。我需要删除的所有数据库都有相同的前缀“Whatever _”。

在前缀之后,名称是随机的。所以你有你的Whatever_something,Whatever_232,Whatever_blabla,....,Whatever_imthelast。

我会做这个工作很多次,所以我想知道最好的方法是什么?

修改 我可以使用任何类型的语言或插入mysql ...所以我们可以在某些方面做到这一点。现在,我问那个正在生成数据库的人给我一个.txt,每个名字都在一行......所以即时编码一个快速的php,它将获取一个文件并删除其中的所有数据库,稍后我会尝试%答案(如果它有效,它需要正确的答案,以确保它更简单的方式)。无论如何,我想这样做更容易,因为我无法支持这个代码(其他人会,你知道......)

编辑2: 使用通配符不起作用:#1008 - 无法删除数据库'whatever_%';数据库不存在

11 个答案:

答案 0 :(得分:80)

基本思想是在数据库中运行“show tables”,并使用其中的结果来选择 你想要的桌子。我不认为MySQL允许你对“show tables”的结果集做任何事情, 但我可能错了。

这是一个使用shell的快速​​解决方案:

mysql -u your_user -D your_database_name -e "show tables" -s | 
  egrep "^Whatever_" | 
  xargs -I "@@" echo mysql -u your_user -D your_database_name -e "DROP TABLE @@"

这将打印出所有shell命令以删除以“Whatever_”开头的表。如果您希望它实际执行这些命令,请删除“echo”一词。

编辑:我忘了解释上面的内容!我不知道你对shell脚本的熟悉程度,但是这里有:

mysql -u your_user -D your_database_name -e "show tables" -s

打印出所有表的列表,标题为“Tables_in_your_database_name”。通过下一个命令管道输出(|符号表示“管道”,如传递):

egrep "^Whatever_"

搜索任何开始的行(^符号表示“有生命”)单词“Whatever_”并仅打印那些。最后,我们通过命令管道“Whatever_ *”表的列表:

xargs -I "@@" echo mysql -u your_user -D your_database_name -e "DROP TABLE @@"

取表名列表中的每一行,并在命令中插入而不是“@@”

echo mysql -u your_user -D your_database_name -e "DROP TABLE @@"

因此,如果您有一堆名为“Whatever_1”,“Whatever_2”,“Whatever_3”的表格,生成的命令将为:

echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_1"
echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_2"
echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_3"

将输出以下内容:

mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_1"
mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_2"
mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_3"

我希望这是足够的细节,而且我不仅仅是因为信息过多而殴打任何人。祝你好运,使用“DROP TABLE”命令时要小心!

答案 1 :(得分:26)

scraimer 的答案原则是正确的,但由于问题是关于丢弃数据库而不是数据库中的表,正确的命令应该是:

mysql -u your_username -p'your password' -e 'show databases' 
| grep Whatever_* 
| xargs -I "@@" mysql -u your_username -p'your password' -e "DROP database \`@@\`"

有关命令的说明,请查看 scraimer 的说明。

最后一点......     \`@@ \` 我们在bacticks(`)中引用了我们生成的数据库名称,以防我们的数据库名称具有特殊字符,如`-`

干杯

答案 2 :(得分:12)

我们可以使用存储过程来完成此操作。以下是一个:

drop procedure if exists droplike;
delimiter //
create procedure droplike(pattern varchar(20))
begin
  set group_concat_max_len = 65535;
  select @drop:= concat( 'drop table ', group_concat(table_name) , ';' ) from information_schema.tables where table_schema = "database_name" and table_name like pattern;
  prepare statement from @drop;
  execute statement;
end //
delimiter ;

将database_name替换为数据库的名称(需要写入权限)。 要删除带有XYZ模式的表,请使用输入作为XYZ调用该过程,然后使用外卡,如下所示:

call droplike("XYZ%");

答案 3 :(得分:1)

我认为你无法删除MySql中的多个数据库。

但我有一个非常讨人喜欢的解决方案。您可以使用C / C ++ / C#/ JAVA编程,将“DROP DATABASE WHATEVER_<name>;”多次打印到记事本或任何文本编辑器中。之后,您可以在MySql的客户端命令提示符中复制粘贴,然后就可以了。不要忘记每个;命令后的“DROP”。

我相信这是可能的。试着写这个。

答案 4 :(得分:1)

这个(Jython)怎么样?

rs = stmt.executeQuery( "SHOW DATABASES LIKE 'Whatever_%'" )
databases_for_dropping = []
while rs.next():
  databases_for_dropping.append( rs.getString( 1 ))
for database_for_dropping in databases_for_dropping:
  stmt.execute( "DROP DATABASE %s" % database_for_dropping ) 

答案 5 :(得分:1)

这里有一些不错的整洁解决方案。但是我所做的只是:

SHOW TABLES LIKE 'migrate%';
在MySQL工作台中

然后,我将结果复制到一个可以使用转义序列查找/替换的体面的文本编辑器中,然后将\n替换为;\nDROP TABLE,并整理开始和结束位置。然后复制回MySQL工作台。比某些建议的解决方案更手动,更不美观,但实际上同样快捷。

答案 6 :(得分:0)

如果有人正在寻找一个反映抓取器资源管理器的简单答案,但是使用JDBC用Java编写(我知道我是),这里很快那个为我完成工作的肮脏的人:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class DatabaseDeleter {
    // Pass your database wildcard as the only argument to program ( "%MY_CRAZY_PATTERN%")
    public void main(String[] args) throws SQLException, ClassNotFoundException{

        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://databaseURL");
        PreparedStatement pst = connection.prepareStatement("show databases like ?");
        pst.setString(1, args[0]);
        ResultSet rs = pst.executeQuery();

        ArrayList<String> databases = new ArrayList<String>();
        while (rs.next()) databases.add(rs.getString(1));

        for (String s : databases){
            Statement st = connection.createStatement();
            st.execute("drop database " + s);
        }
        connection.close();
    }
}

警告:如果您不希望对SQL服务器进行搜查,请不要向客户或其他开发人员展示。

答案 7 :(得分:-1)

很抱歉,我们不能使用sql命令一次删除多个数据库

答案 8 :(得分:-2)

DROP DATABASE `any-database_name`;

我只是在数据库名称之前和之后使用此字符`(反引号)。

答案 9 :(得分:-4)

你可以尝试mysql 5 general purpose routine library (可从here下载)。使用它,您可以删除多个与正则表达式匹配的表。我建议仔细检查正则表达式,以防止丢弃你需要的表。

答案 10 :(得分:-7)

使用

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

声明为described here

我不知道你是否可以使用野猫来做类似

的事情
DROP DATABASE Whatever_%

但我认为你应该尝试一下。