2009-10-19 148 views

回答

134

你不能只是一個單一的MySQL命令做到這一點,但是你可以使用MySQL來構建你的語句:

在MySQL的殼或通過phpmyadmin,使用以下查詢

SELECT CONCAT('DROP TABLE ', GROUP_CONCAT(table_name) , ';') 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'myprefix_%'; 

,這將產生一個DROP語句,你可以比複製並執行刪除該表。

編輯:這裏的免責聲明 - 上面生成的聲明將使用該前綴刪除所有數據庫中的所有表。如果你想將其限制在一個特定的數據庫,修改查詢到這個樣子,並用自己的數據庫名稱替換數據庫名稱:

SELECT CONCAT('DROP TABLE ', GROUP_CONCAT(table_name) , ';') 
    AS statement FROM information_schema.tables 
    WHERE table_schema = 'database_name' AND table_name LIKE 'myprefix_%'; 
+0

我只有一個數據庫,所以我不需要第二個。 –

+0

謝謝!所以問題在於我的MySQL服務器太慢了。需要10-15分鐘來執行腳本。然後,顯示完整的腳本花了太長時間,我停止了它。有更多時間後再試。 –

+0

忽略外鍵檢查怎麼樣? – Raptor

3

你可以做到這一點與MySQL一個命令:

drop table myprefix_1, myprefix_2, myprefix_3;

你很有可能要在代碼中動態創建表名單雖然。

另一種方法是使用general purpose routine library爲MySQL 5

17
show tables like 'prefix_%'; 

複製結果並將其粘貼到文本編輯器或輸出查詢到一個文件,使用一些搜索和替換刪除不需要的格式,並用逗號代替\n,逗號 將;放在最後,並將刪除表添加到前面。

,你會得到的東西看起來是這樣的:

drop table myprefix_1, myprefix_2, myprefix_3; 
+0

無法訪問我正在使用的虛擬主機上的information_schema.tables,所以這是要走的路! – Florent

10

@andre-miller的解決方案是好的,但有更好的和稍微更專業,這將幫助你一次過執行所有。仍然需要多個命令,但該解決方案將允許您使用SQL進行自動構建。

SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME) 
    FROM information_schema.TABLES 
    WHERE TABLE_NAME LIKE 'myprefix_%'); 
PREPARE stmt FROM 'DROP TABLE @tbls'; 
EXECUTE stmt USING @tbls; 
DEALLOCATE PREPARE stmt; 

注意:此代碼是與平臺相關的,它是MySQL,但可以肯定它可以實現對Postgre,Oracle和MS SQL略有改動。

+0

錯誤1064(42000):您的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以在第1行'@tbls'附近使用正確的語法。 錯誤1243(HY000):給予EXECUTE ERROR 1243(HY000)的未知預備語句處理程序(stmt):未知預處理語句處理程序(stmt)給予DEALLOCATE PREPARE –

+0

語法錯誤在:PREPARE stmt FROM'DROP TABLE @tbls'; –

1
SELECT CONCAT("DROP TABLE ", table_name, ";") 
FROM information_schema.tables 
WHERE table_schema = "DATABASE_NAME" 
AND table_name LIKE "PREFIX_TABLE_NAME%"; 
25

一些較早的答案是非常好的。 我把他們的想法與網絡上其他答案的 概念放在一起。

我需要刪除以「temp_」 我想出了這個代碼塊經過幾次反覆的所有表:

-- Set up variable to delete ALL tables starting with 'temp_' 
SET GROUP_CONCAT_MAX_LEN=10000; 
SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME) 
       FROM information_schema.TABLES 
       WHERE TABLE_SCHEMA = 'my_database' 
       AND TABLE_NAME LIKE 'temp_%'); 
SET @delStmt = CONCAT('DROP TABLE ', @tbls); 
-- SELECT @delStmt; 
PREPARE stmt FROM @delStmt; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

我希望這是其他MySQL/PHP程序員有用。

1

我發現準備好的語句對我來說工作起來有點棘手,但是當你有很多表時,設置GROUP_CONCAT_MAX_LEN是必不可少的。這就產生了一個簡單的三個步驟,與剪切和從工作對我來說很大的mysql的命令行粘貼:

SET GROUP_CONCAT_MAX_LEN=10000; 
SELECT CONCAT('DROP TABLE ', GROUP_CONCAT(table_name) , ';') 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'myprefix_%'; 

然後小心剪切和粘貼所得長條狀DROP聲明。

+0

以'\ G'結束查詢而不是';'給出了一點清理輸出 –

1

我只是想後我使用的確切SQL - 這是前3回答混合物的東西:

SET GROUP_CONCAT_MAX_LEN=10000; 

SET @del = (
    SELECT  CONCAT('DROP TABLE ', GROUP_CONCAT(TABLE_NAME), ';') 
    FROM  information_schema.TABLES 

    WHERE  TABLE_SCHEMA = 'database_name' 
    AND   TABLE_NAME LIKE 'prefix_%' 
); 

PREPARE stmt FROM @del; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
3

我滴成功表通過編輯查詢喜歡這個

SET GROUP_CONCAT_MAX_LEN=10000; 
SET FOREIGN_KEY_CHECKS = 0; 
SET @tbls = (SELECT GROUP_CONCAT(CONCAT('`', TABLE_NAME, '`')) 
      FROM information_schema.TABLES 
      WHERE TABLE_SCHEMA = 'pandora' 
      AND TABLE_NAME LIKE 'temp_%'); 
SET @delStmt = CONCAT('DROP TABLE ', @tbls); 
-- SELECT @delStmt; 
PREPARE stmt FROM @delStmt; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
SET FOREIGN_KEY_CHECKS = 1; 
+0

這是我發現的唯一一個在處理外鍵約束時在一個shebang中完成整個操作的程序。 –

0

只是另一種解決方案,使用GROUP_CONCAT所以它會執行一個下拉查詢,如
DROP TABLE table1,table2,..

SET @Drop_Stm = CONCAT('DROP TABLE ', (
     SELECT GROUP_CONCAT(TABLE_NAME) AS All_Tables FROM information_schema.tables 
     WHERE TABLE_NAME LIKE 'prefix_%' AND TABLE_SCHEMA = 'database_name' 
)); 
PREPARE Stm FROM @Drop_Stm; 
EXECUTE Stm; 
DEALLOCATE PREPARE Stm;