回答:
MySQLコマンドを1つだけで実行することはできませんが、MySQLを使用してステートメントを構築できます。
MySQLシェルまたはPHPMyAdminで、次のクエリを使用します
SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' )
AS statement FROM information_schema.tables
WHERE table_name LIKE 'myprefix_%';
これにより、コピーして実行してテーブルを削除できるDROPステートメントが生成されます。
編集:ここでの免責事項-上記で生成されたステートメントは、そのプレフィックスを持つすべてのデータベース内のすべてのテーブルを削除します。特定のデータベースに制限する場合は、クエリを次のように変更し、database_nameを独自のdatabase_nameに置き換えます。
SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' )
AS statement FROM information_schema.tables
WHERE table_schema = 'database_name' AND table_name LIKE 'myprefix_%';
[...] LIKE 'myprefix\_%';
以前の回答のいくつかは非常に良かった。私は彼らのアイデアをウェブ上の他の回答からのいくつかの概念と結びつけました。
'temp_'で始まるすべてのテーブルを削除する必要がありました。数回の反復の後、次のコードブロックが思い付きました。
-- Set up variable to delete ALL tables starting with 'temp_'
SET GROUP_CONCAT_MAX_LEN=10000;
SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME)
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'my_database'
AND TABLE_NAME LIKE 'temp_%');
SET @delStmt = CONCAT('DROP TABLE ', @tbls);
-- SELECT @delStmt;
PREPARE stmt FROM @delStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
これが他のMySQL / PHPプログラマーにとって役立つことを願っています。
show tables like 'prefix_%';
結果をコピーしてテキストエディターに貼り付けるか、クエリをファイルに出力し、いくつかの検索と置換を使用して不要なフォーマットを削除\n
し、コンマで置き換えます。;
し、最後にドロップテーブルを前面に追加します。
次のようなものが表示されます。
drop table myprefix_1, myprefix_2, myprefix_3;
@ andre-millerソリューションは優れていますが、すべてを一度に実行するのに役立つ、より優れたわずかに専門的なソリューションがあります。それでも複数のコマンドが必要ですが、このソリューションを使用すると、自動ビルドにSQLを使用できます。
SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME)
FROM information_schema.TABLES
WHERE TABLE_NAME LIKE 'myprefix_%');
PREPARE stmt FROM 'DROP TABLE @tbls';
EXECUTE stmt USING @tbls;
DEALLOCATE PREPARE stmt;
注:このコードはプラットフォームに依存します。MySQL用ですが、わずかな変更でPostgre、Oracle、MS SQL用に実装できることは確かです。
このようにクエリを編集してテーブルを正常にドロップします
SET GROUP_CONCAT_MAX_LEN=10000;
SET FOREIGN_KEY_CHECKS = 0;
SET @tbls = (SELECT GROUP_CONCAT(CONCAT('`', TABLE_NAME, '`'))
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'pandora'
AND TABLE_NAME LIKE 'temp_%');
SET @delStmt = CONCAT('DROP TABLE ', @tbls);
-- SELECT @delStmt;
PREPARE stmt FROM @delStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
MySQLの1つのコマンドでそれを行うことができます。
drop table myprefix_1, myprefix_2, myprefix_3;
ただし、コードで動的にテーブルリストを作成する必要があります。
別のアプローチは、MySQL 5の汎用ルーチンライブラリを使用することです。
私が使用した正確なSQLを投稿したかっただけです。これは、上位3つの回答が混在したものです。
SET GROUP_CONCAT_MAX_LEN=10000;
SET @del = (
SELECT CONCAT('DROP TABLE ', GROUP_CONCAT(TABLE_NAME), ';')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database_name'
AND TABLE_NAME LIKE 'prefix_%'
);
PREPARE stmt FROM @del;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
GROUP_CONCATを使用する別のソリューションなので、DROP TABLE table1、table2、..のような1つのドロップクエリを実行し
ます。
SET @Drop_Stm = CONCAT('DROP TABLE ', (
SELECT GROUP_CONCAT(TABLE_NAME) AS All_Tables FROM information_schema.tables
WHERE TABLE_NAME LIKE 'prefix_%' AND TABLE_SCHEMA = 'database_name'
));
PREPARE Stm FROM @Drop_Stm;
EXECUTE Stm;
DEALLOCATE PREPARE Stm;
準備されたステートメントは私にとってGROUP_CONCAT_MAX_LEN
うまくいくのが少し難しいことに気付きましたが、テーブルがたくさんあるときは設定が不可欠でした。これにより、mysqlコマンドラインからのカットアンドペーストによる簡単な3ステップのプロセスが実現しました。
SET GROUP_CONCAT_MAX_LEN=10000;
SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' )
AS statement FROM information_schema.tables
WHERE table_name LIKE 'myprefix_%';
次に、結果の長いDROPステートメントを慎重にカットアンドペーストします。
\G
代わりにで終了すると、;
出力が少し