在MySQL中删除表

时间:2011-03-24 15:04:18

标签: mysql

我有一个包含表格的数据库,其中一些例子名为“_data”,“_ keep”,“foo”,“bar”

不丢弃Db中的所有表格, 如何删除所有不以“_”开头的表格。在上面的例子中foo和bar。

使用Sql

有关用作表名的关键字有问题,是不是要删除“_”而是删除任何超过10分钟的表。 (我想在创建表之前删除。现在希望在更新后删除。)

4 个答案:

答案 0 :(得分:4)

set @str = (select concat('drop table ', group_concat(table_name separator ','),';')
from information_schema.tables
where table_schema = 'your_database_name' and table_name not regexp '^_');
prepare stmt from @str;
execute stmt;
deallocate prepare stmt;

修改。我在这里回答你,因为它更具可读性。 如果您只想检索超过10分钟前创建的表,则必须执行

select table_name from information_schema.tables
where table_schema = 'your_db'
and now() - interval 10 minute > create_time 

将where子句应用于我之前的代码。 我希望这就是你要找的东西。

答案 1 :(得分:4)

delimiter $$
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('_%', 'db_1')$$

drop procedure if exists drop_tables_like$$
delimiter ;

答案 2 :(得分:1)

以下一行:

mysqldump -u [username] -p [password] --add-drop-table --no-data [databasename]|grep ^DROP

生成所有表的列表,如下所示:

DROP TABLE IF EXISTS `agenda`;
DROP TABLE IF EXISTS `bla`;
DROP TABLE IF EXISTS `test`;
DROP TABLE IF EXISTS `users`;

使用“grep”过滤该列表并将其重新导入mysql。

mysqldump -u [username] -p [password] --add-drop-table --no-data [databasename] | \
    grep -E "^DROP TABLE IF EXISTS .[^_]" | mysql -u [username] -p [password] [databasename]

答案 3 :(得分:0)

结帐mk-find。它允许您对服务器运行命令,并根据这些命令的结果运行其他命令。