SQL:接頭辞付きのテーブルの削除


回答:


178

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_%';

データベースが1つしかないので、2番目のデータベースは必要ありません。
Deniz Zoeteman、2009年

4
@ElijahLynn制限ソースはおそらくGROUP_CONCATの最大長によるものです。あなたはそれを拡大することができます、例えばここを
アサフ・デビッド14

7
自分への注意:最大文字数を増やす:SET SESSION group_concat_max_len = 999999999;
Mohammed Joraid 2015

2
場合によっては、テーブルプレフィックス名のアンダースコアをエスケープする必要があることに注意してください[...] LIKE 'myprefix\_%';
Magictallguy

1
これにより、多数の重複するtable_nameが返されます。Pankaj Khuranaが投稿した答えは、より良いIMHOです。
ジェレミー

37

以前の回答のいくつかは非常に良かった。私は彼らのアイデアをウェブ上の他の回答からのいくつかの概念と結びつけました。

'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プログラマーにとって役立つことを願っています。


1
これはまさに正しい答えです。他の回答では、複数の手順を使用するか、手動で行う必要があります。この回答で4年後に投票数が減る方法がわからない!
gbe

25
show tables like 'prefix_%';

結果をコピーしてテキストエディターに貼り付けるか、クエリをファイルに出力し、いくつかの検索と置換を使用して不要なフォーマットを削除\nし、コンマで置き換えます。;し、最後にドロップテーブルを前面に追加します。

次のようなものが表示されます。

drop table myprefix_1, myprefix_2, myprefix_3;

1
私が使用しているウェブホストのinformation_schema.tablesにアクセスできなかったので、これは感謝の気持ちを表す方法でした。
Florent Roques、2018

10

@ 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用に実装できることは確かです。


エラー1064(42000):SQL構文にエラーがあります。MySQLサーバーのバージョンに対応するマニュアルで、1行目の '@tbls'付近で使用する正しい構文を確認してください。 (stmt)DEALLOCATE PREPAREに付与
Roni Tovi

構文エラー:PREPARE stmt FROM 'DROP TABLE @tbls';
ledawg 2016年

5
SELECT CONCAT("DROP TABLE ", table_name, ";") 
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME" 
AND table_name LIKE "PREFIX_TABLE_NAME%";

3

このようにクエリを編集してテーブルを正常にドロップします

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;

これは、外部キーの制約に対処しながら1つのシバンで操作全体を実行した唯一の方法でした。
Evan Mattson

2

MySQLの1つのコマンドでそれを行うことができます。

drop table myprefix_1, myprefix_2, myprefix_3;

ただし、コードで動的にテーブルリストを作成する必要があります。

別のアプローチは、MySQL 5の汎用ルーチンライブラリを使用することです。


2

私が使用した正確な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;

2

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;

1

準備されたステートメントは私にとって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代わりにで終了すると、;出力が少し
わかりやすくなり
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.