mySQL是否仅使用SQL语句删除带有通配符的表?
看到了很多使用通配符而不是直接SQL语句删除表的例子,除了以下语句:mySQL是否仅使用SQL语句删除带有通配符的表?,mysql,Mysql,看到了很多使用通配符而不是直接SQL语句删除表的例子,除了以下语句: http://azimyasin.wordpress.com/2007/08/11/mysql-dropping-multiple-tables/ 它说: SHOW TABLES LIKE ‘phpbb_%’; 然后删除表,是否有一种简洁的方法将所有这些合并到一个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
请注意正在创建/执行存储例程的数据库用户:它必须具有执行/删除表的适当凭据