2011-12-05 41 views
0

看過很多關於使用通配符,但不是直接的SQL語句,除了這一個刪除表:mySQL僅使用SQL語句刪除帶有通配符的表?

http://azimyasin.wordpress.com/2007/08/11/mysql-dropping-multiple-tables/ 

它說:

SHOW TABLES LIKE ‘phpbb_%’; 

然後刪除表,有沒有結合這一種巧妙的方法全部合併成一個SQL語句?

回答

2

您可以使用動態SQL在存儲過程中執行此操作。它會看起來像這樣(未經):

CREATE PROCEDURE drop_like (IN pattern VARCHAR(64)) 
BEGIN 
    DECLARE q tinytext; 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE cur CURSOR FOR 
    SELECT CONCAT('DROP TABLE "', table_schema, '"."', table_name, '"') 
    FROM information_schema.tables WHERE table_type = 'BASE TABLE' AND table_name LIKE pattern; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 
    OPEN cur; 

    drop_loop: LOOP 
    FETCH cur INTO q; 
    IF done THEN 
     LEAVE drop_loop; 
    END IF; 
    PREPARE stmt FROM @q; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
    END LOOP; 
    CLOSE cur; 
END; 
1

在查詢中使用動態SQL,按照derobert的答案,是唯一的純SQL(沒有應用程序代碼)來做到這一點。

我寫了一個通用方法做這樣的,你可以找到here件事(運行在數據庫中的每個表的查詢) - 使用它,你只需要運行這個查詢:

CALL p_run_for_each_table('databasename', 'DROP TABLE `{?database}`.`{?table}`'); 

它的工作原理與derobert的答案基本相同。

但是,該博客文章的作者可能希望您編寫應用程序代碼以將表名轉換爲單個DROP聲明。

要做到這一點,你會遍歷SHOW TABLE在你的代碼的結果,並建立這樣一個查詢:

DROP TABLE table1, table2, tablewhatever;