mySQL是否仅使用SQL语句删除带有通配符的表?

mySQL是否仅使用SQL语句删除带有通配符的表?,mysql,Mysql,看到了很多使用通配符而不是直接SQL语句删除表的例子,除了以下语句: http://azimyasin.wordpress.com/2007/08/11/mysql-dropping-multiple-tables/ 它说: SHOW TABLES LIKE ‘phpbb_%’; 然后删除表,是否有一种简洁的方法将所有这些合并到一个SQL语句中 您可以在存储过程中使用动态SQL来实现这一点。它看起来像这样(未经测试): 您可以在存储过程中使用动态SQL来实现这一点。它看起来像这样(未经测试)

看到了很多使用通配符而不是直接SQL语句删除表的例子,除了以下语句:

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

SHOW TABLES LIKE ‘phpbb_%’;

然后删除表,是否有一种简洁的方法将所有这些合并到一个SQL语句中

您可以在存储过程中使用动态SQL来实现这一点。它看起来像这样(未经测试):


您可以在存储过程中使用动态SQL来实现这一点。它看起来像这样(未经测试):


根据derobert的回答,在查询中使用动态SQL是使用纯SQL(无应用程序代码)进行此操作的唯一方法

我编写了一个通用过程来执行您可以找到的这类操作(对数据库中的每个表运行一个查询)——要使用它,您只需要运行以下查询:

CALL p_run_for_each_table('databasename', 'DROP TABLE `{?database}`.`{?table}`');
它的工作原理与derobert的答案基本相同

然而,这篇博文的作者可能希望您编写应用程序代码,将表名转换为单个
DROP
语句

为此,您需要在代码中迭代
SHOW TABLE
的结果,并构建一个如下的查询:

DROP TABLE table1, table2, tablewhatever;

根据derobert的回答,在查询中使用动态SQL是使用纯SQL(无应用程序代码)进行此操作的唯一方法

我编写了一个通用过程来执行您可以找到的这类操作(对数据库中的每个表运行一个查询)——要使用它,您只需要运行以下查询:

CALL p_run_for_each_table('databasename', 'DROP TABLE `{?database}`.`{?table}`');
它的工作原理与derobert的答案基本相同

然而,这篇博文的作者可能希望您编写应用程序代码,将表名转换为单个
DROP
语句

为此,您需要在代码中迭代
SHOW TABLE
的结果,并构建一个如下的查询:

DROP TABLE table1, table2, tablewhatever;

这可以通过存储过程实现,例如:

CREATE DEFINER=`some_user`@`%` PROCEDURE `drop_tables`()
LANGUAGE SQL
NOT DETERMINISTIC
MODIFIES SQL DATA
SQL SECURITY DEFINER
COMMENT ''
BEGIN

#We need to declare a variable with default 0 to determine weather to continue the loop or exit the loop.
DECLARE done INT DEFAULT 0;
DECLARE archive_table_name VARCHAR(100);

#Select desired tables from `information_schema`
DECLARE cur CURSOR FOR
    SELECT t.`TABLE_NAME` FROM information_schema.`TABLES` t WHERE  t.`TABLE_NAME`  LIKE 'some_table_name%'
    AND t.CREATE_TIME BETWEEN DATE_SUB(NOW(), INTERVAL 9 MONTH) AND DATE_SUB(NOW(), INTERVAL 6 MONTH);

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN cur;
read_loop: LOOP

    #Fetch one record from CURSOR and set variable (if not found, then variable `done` will be set to 1 by continue handler)
    FETCH cur INTO archive_table_name;    
     
     IF done THEN
        LEAVE read_loop;  #If done is set to 1, then exit the loop, else continue
    END IF;
 
    #Do your work
    -- Create the truncate query
    SET @s = CONCAT('DROP TABLE IF EXISTS ', archive_table_name);
    -- Prepare, execute and deallocate the truncate query
    PREPARE drop_statement FROM @s;
    EXECUTE drop_statement;
    DEALLOCATE PREPARE drop_statement;
    

END LOOP;
CLOSE cur; #Closing the cursor

END

请注意正在创建/执行存储例程的数据库用户:它必须具有执行/删除表的相应凭据。

这可以通过存储过程实现,例如:

CREATE DEFINER=`some_user`@`%` PROCEDURE `drop_tables`()
LANGUAGE SQL
NOT DETERMINISTIC
MODIFIES SQL DATA
SQL SECURITY DEFINER
COMMENT ''
BEGIN

#We need to declare a variable with default 0 to determine weather to continue the loop or exit the loop.
DECLARE done INT DEFAULT 0;
DECLARE archive_table_name VARCHAR(100);

#Select desired tables from `information_schema`
DECLARE cur CURSOR FOR
    SELECT t.`TABLE_NAME` FROM information_schema.`TABLES` t WHERE  t.`TABLE_NAME`  LIKE 'some_table_name%'
    AND t.CREATE_TIME BETWEEN DATE_SUB(NOW(), INTERVAL 9 MONTH) AND DATE_SUB(NOW(), INTERVAL 6 MONTH);

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN cur;
read_loop: LOOP

    #Fetch one record from CURSOR and set variable (if not found, then variable `done` will be set to 1 by continue handler)
    FETCH cur INTO archive_table_name;    
     
     IF done THEN
        LEAVE read_loop;  #If done is set to 1, then exit the loop, else continue
    END IF;
 
    #Do your work
    -- Create the truncate query
    SET @s = CONCAT('DROP TABLE IF EXISTS ', archive_table_name);
    -- Prepare, execute and deallocate the truncate query
    PREPARE drop_statement FROM @s;
    EXECUTE drop_statement;
    DEALLOCATE PREPARE drop_statement;
    

END LOOP;
CLOSE cur; #Closing the cursor

END
请注意正在创建/执行存储例程的数据库用户:它必须具有执行/删除表的适当凭据