2010-11-18 80 views
1

我有一個MySQL數據庫,其中包含許多表,其中一些表由軟件動態創建。動態表具有一致的命名方案:在MySQL中刪除動態管理表

dynamic_1 
dynamic_2 
... 

但是,我不一定知道這些表中有多少。

我希望能夠刪除所有這些動態表而不刪除整個數據庫。我希望能夠純粹在SQL中完成此操作。 (存儲過程可以。)這是甚至可能的嗎?


快速附錄。

Haim和Alexandre的解決方案效果很好,但我們都錯過了一個特例。如果沒有 - 動態表呢?在這種情況下,@v將爲NULL,當我們嘗試執行時,會出現錯誤。我添加了第二個變量來處理這種情況:

SET @v = (SELECT CONCAT('drop table ', GROUP_CONCAT(a.table_name)) FROM information_schema.tables a where a.table_schema = DATABASE() AND a.table_name like 'dynamic_%'); 
SET @y = (SELECT IF (@V IS NOT NULL, @V, 'select 1')); 
PREPARE s FROM @y; 
EXECUTE s; 

回答

3

您可以運行此查詢,並得到所有你需要運行SQL查詢;

select concat('drop table ', a.table_name, ';') 
from information_schema.tables a 
where a.table_name like 'dynamic_%'; 

,你可以將其插入到根據亞歷山大評論文件中像

INTO OUTFILE '/tmp/delete.sql'; 

更新

SET @v = (select concat('drop table ', group_concat(a.table_name)) 
    from information_schema.tables a 
    where a.table_name like 'dynamic_%' 
    AND a.table_schema = DATABASE() 
;); 
PREPARE s FROM @v; 
EXECUTE s; 
+0

你或許應該加上'和a.table_schema = DATABASE()'只搜索當前數據庫 – 2010-11-18 06:45:51

+0

哇,這看起來不錯。 (是的,a.table_schema很有用。)是否可以將結果集分配給一個變量並在同一個腳本中執行它? – njudge 2010-11-18 06:49:35

+0

我想你只能在存儲過程中使用循環 – 2010-11-18 06:51:06