web-dev-qa-db-ja.com

SQL:プレフィックス付きのテーブルの削除

すべて接頭辞myprefix_を持つテーブルを削除する方法は?

注:phpMyAdminで実行する必要があります

90
Deniz Zoeteman

1つのMySQLコマンドだけではできませんが、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_%';
160
Andre Miller

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

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

30
Bradley Slavik
show tables like 'prefix_%';

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

次のようなものが得られます。

drop table myprefix_1, myprefix_2, myprefix_3;
21
Daniel

@ 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にわずかな変更を加えて実装できます。

10
Alex Rashkov

このようにクエリを編集してテーブルを正常に削除します

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;
3
Duong Vo
SELECT CONCAT("DROP TABLE ", table_name, ";") 
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME" 
AND table_name LIKE "PREFIX_TABLE_NAME%";
3
Pankaj Khurana

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

drop table myprefix_1, myprefix_2, myprefix_3;

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

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

2
Asaph

使用した正確な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
Danny Beckett

準備されたステートメントは、私のために働くのに少し難しいですが、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 [〜#〜]ステートメントを慎重にカットアンドペーストします。

1
drchuck

GROUP_CONCATを使用した別のソリューションであるため、次のような1つのドロップクエリが実行されます。
DROP TABLE table1、table2、..

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