有没有办法截断特定MySQL数据库名称中的所有表,而不使用除SQL语言之外的任何其他语言?我的意思是没有linux shell脚本。(为什么?因为它将在windows、MacOSX和linux服务器上运行)。
问题是,客户端正在从控制面板网页的列表中选择数据库名称(将显示来自不同服务器*nix和windows的MySQL数据库),然后他会想要截断该数据库中的所有表(是的,这是web表单的主要任务)。
亚历克斯
发布于 2011-01-21 16:02:54
好的,我自己解决了这个问题,下面是存储过程:)
BEGIN
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE truncatestmnt TEXT; -- this is where the truncate statement will be retrieved from cursor
-- This is the magic query that will bring all the table names from the database
DECLARE c1 CURSOR FOR SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE INFORMATION_SCHEMA.TABLES.TABLE_SCHEMA = "@DatabaseName";
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE;
OPEN c1;
c1_loop: LOOP
FETCH c1 INTO truncatestmnt;
IF `done` THEN LEAVE c1_loop; END IF;
SET @x = truncatestmnt;
PREPARE stm1 FROM @x;
EXECUTE stm1;
END LOOP c1_loop;
CLOSE c1;
END我让它调用给定数据库中的所有表,如果给定数据库中的表没有可遵循的模式,这将会有所帮助。
因此,通过调用DECLARE c1 CURSOR FOR SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE INFORMATION_SCHEMA.TABLES.TABLE_SCHEMA = "@DatabaseName";并将结果保存到游标中,我可以获取给定数据库中由"n“个表生成的所有TRUNCATE TABLE x语句,然后通过准备和执行游标中的每个语句,它将截断给定数据库中的所有表。
必须将
BTW @DatabaseName作为参数提供给存储过程
希望这对其他人也有帮助:)
亚历克斯
发布于 2011-01-21 15:56:36
create procedure drop_tables_like(pattern varchar(255), db varchar(255))
begin
select @str_sql:=concat('drop table ', group_concat(table_name))
from information_schema.tables
where table_schema=db and table_name like pattern;
prepare stmt from @str_sql;
execute stmt;
drop prepare stmt;
end然后调用
call drop_tables_like('%', 'dababase_name')https://stackoverflow.com/questions/4756430
复制相似问题