2009-01-19 97 views
48

在我需要丟棄大量數據庫的服務器上運行mySQL(在對服務器進行一些測試之後)。我需要刪除的所有數據庫都有相同的前綴「Whatever_」。刪除與某些通配符匹配的MySQL數據庫?

在前綴後面,名稱是隨機的。所以你有你的Whatever_something,Whatever_232,Whatever_blabla,....,Whatever_imthelast。

我會做這個工作很多次,所以我想知道什麼是最好的方法來做到這一點?

編輯: 我可以用任何一種語言或插入MySQL的...所以我們可以在某些方面做到這一點。現在,我問那個正在生成數據庫的人給我一個.txt,每行的名字都是一行...所以即時編碼一個快速的PHP,將採取一個文件,並刪除其中的所有數據庫,後來我會嘗試答案的百分比(如果它的工作,它確實需要正確的答案,更簡單的方法)。無論如何,我想這樣做的更簡單的方法怎麼我將無法支持此代碼(其他人會和你知道...)

編輯2: 使用通配符沒有工作的:#1008 - 不能刪除數據庫'whatever_%';數據庫不存在

回答

78

最基本的想法是在數據庫中運行「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」命令時要小心!

+0

與我一樣,它不會在`-e`後輸出引號(```),它會輸出這樣的行:`mysql -u root -D joomla_test -e DROP TABLE bak_xlr1q_weblinks` using your exact bash script。I'm using Bash 4.1.5(1)-release。 – Hubro 2013-02-27 19:48:16

+0

@Codemonkey爲了讓引號出現,你可以將它們轉義。用`\ DROP TABLE @@「替換` 「DROP TABLE @@ \」` – scraimer 2013-02-28 09:35:28

-4

您可以嘗試mysql 5 general purpose routine library (可從here下載)。使用它,你可以刪除多個匹配正則表達式的表。我建議仔細檢查正則表達式,以防止丟棄需要的表。

+0

我想你沒看完整個問題。他想刪除多個「數據庫」而不是多表「表」。 – Xn0vv3r 2009-01-19 07:22:42

-1

抱歉,我們無法在使用SQL一次刪除多個數據庫命令

+1

我們可以使用sql命令一次刪除多個表 – Adnan 2011-10-21 19:34:53

+0

DROP table table1,table2 ... – Adnan 2011-10-21 19:35:16

-7

使用

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name 

語句described here

我不知道是否可以使用wildcars做這樣的事情

DROP DATABASE Whatever_% 

,但我認爲你應該嘗試一下。

+0

#1008 - 無法刪除數據庫'whatever_%';數據庫不存在aparently它只能在SELECT中工作 – DFectuoso 2009-01-19 07:20:28

1

以及我認爲你不能刪除MySql中的多個數據庫。

但我有一個非常令人討厭的解決方案。您可以使用C/C++/C#/ JAVA進行編程,在記事本或任何文本編輯器中多次打印「DROP DATABASE WHATEVER_<name>;」。之後,您可以將粘貼複製到MySql的客戶端命令提示符中,然後就可以開始了。在每個DROP命令之後不要忘記「;」。

我相信這是可能的。試着寫這個。

25

答案由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(')的情況下,我們的數據庫名有特殊字符,如`-`

乾杯

-1
DROP DATABASE `any-database_name`; 

我只是在我的數據庫名稱前後使用這個字符`(反向)。

11

我們可以用存儲過程來做到這一點。下面是一個:

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%"); 
0

萬一有人正在尋找一個簡單的答案,反映scraimer瀏覽器

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(); 
    } 
} 

警告:但使用JDBC(我知道我是),這裏有一個快速和骯髒的一個了,我所做的工作用Java編寫的,不要表面上看這對客戶甚至其他開發人員,如果你不要你的SQL服務器遭到洗劫。

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)