如何从MySQL数据库中截断所有表?

时间:2011-01-21 07:35:05

标签: sql mysql stored-procedures truncate

有没有办法在不使用SQL之外的任何其他语言的情况下截断特定MySQL数据库名称中的所有表?我的意思是没有linux shell脚本。 (为什么?因为它将在Windows,MacOSX和Linux服务器上运行)。

问题是客户端从控制面板网页中的列表中选择数据库名称(将从不同的服务器* nix和windows显示MySQL数据库),然后他会想要截断那里面的所有表数据库(是的,这是网络表单的主要任务)。

亚历

2 个答案:

答案 0 :(得分:2)

好的,我自己解决了这里的存储过程:)

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必须作为存储过程的参数

希望这也有助于其他人:)

亚历

答案 1 :(得分:0)

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')
相关问题