2010-11-18 13 views
1

多くのテーブルを含むMySQLデータベースがありますが、そのうちのいくつかはソフトウェアによって動的に作成されます。動的表には一貫した命名規則があります。MySQLで動的に管理されたテーブルを削除する

dynamic_1 
dynamic_2 
... 

ただし、これらの表がいくつあるかは必ずしもわかりません。

データベース全体を削除せずにこれらのダイナミックテーブルをすべて削除できるようにしたいと考えています。私は純粋にSQLでこれを行うことができるようにしたいと思います。 (ストアドプロシージャは正常です)これは可能ですか?


クイック補遺。

ハイムとアレクサンドルのソリューションは素晴らしいですが、私たちが逃した特別なケースが1つあります。動的表がない場合はどうなりますか?その場合、@vはNULLになり、実行しようとするとエラーになります。私はこのケースを処理するために、第2の変数を追加しました:

SET @v = (SELECT CONCAT('drop table ', GROUP_CONCAT(a.table_name)) FROM information_schema.tables a where a.table_schema = DATABASE() AND a.table_name like 'dynamic_%'); 
SET @y = (SELECT IF (@V IS NOT NULL, @V, 'select 1')); 
PREPARE s FROM @y; 
EXECUTE s; 

答えて

3

このクエリを実行し、実行するために必要なすべてのSQLクエリを取得することができます。

select concat('drop table ', a.table_name, ';') 
from information_schema.tables a 
where a.table_name like 'dynamic_%'; 

あなたはそれがアレクサンドルコメントに応じ

INTO OUTFILE '/tmp/delete.sql'; 

更新のように、ファイルに挿入することができ

SET @v = (select concat('drop table ', group_concat(a.table_name)) 
    from information_schema.tables a 
    where a.table_name like 'dynamic_%' 
    AND a.table_schema = DATABASE() 
;); 
PREPARE s FROM @v; 
EXECUTE s; 
+0

あなたは、おそらく追加する必要があります 'とa.table_schema = DATABASE()'だけを検索します現在のデータベース –

+0

うわー、それは素晴らしいです。 (そして、そうです、a.table_schemaは便利です。)結果セットを変数に代入して同じスクリプトで実行することは可能ですか? – njudge

+0

私はループでストアドプロシージャでのみ行うことができると思う –