web-dev-qa-db-ja.com

テーブルのようなMySQLバルクドロップテーブル?

DROP TABLE (
SELECT table_name
FROM information_schema.`TABLES`
WHERE table_schema = 'myDatabase' AND table_name LIKE BINARY 'del%');

私はこれが機能しないことを知っています! SQLでこのようなものと同等のものは何ですか?これを行うための簡単なPythonスクリプトを作成できますが、SQLで直接何かできるかどうか疑問に思っていました。MySQLを使用しています。ありがとうございます!

24
ThinkCode

準備済みステートメント -を使用できます

SET @tables = NULL;
SELECT GROUP_CONCAT('`', table_schema, '`.`', table_name,'`') INTO @tables FROM information_schema.tables 
  WHERE table_schema = 'myDatabase' AND table_name LIKE BINARY 'del%';

SET @tables = CONCAT('DROP TABLE ', @tables);
PREPARE stmt1 FROM @tables;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

このようなステートメントを生成して実行します-

DROP TABLE myDatabase.del1, myDatabase.del2, myDatabase.del3;
45
Devart

@ Devart's answer のマイナーな改善:

SET @tables = NULL;
SELECT GROUP_CONCAT(table_schema, '.`', table_name, '`') INTO @tables FROM
(select * from
 information_schema.tables 
  WHERE table_schema = 'myDatabase' AND table_name LIKE 'del%'
  LIMIT 10) TT;

SET @tables = CONCAT('DROP TABLE ', @tables);
select @tables;
PREPARE stmt1 FROM @tables;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

このスクリプトは、コンソールの出力がNULLになるまで繰り返し実行する必要があります

変更点は次のとおりです。

  1. テーブル名をラップするバックティック( `)(非標準文字が含まれている場合)
  2. 私がコメントした切り捨ての問題を回避するためにLIMITを追加しました
  3. 「印刷」(select @tables;)スクリプトの実行を停止するタイミングを制御する
14
Ron Klein

純粋なSQLではないため、この質問に直接答えないため、テーブルの束をすばやく削除する必要がある場合は、1行のシェルコマンドで実行できます。

echo "show tables like 'fsm%'" | mysql | tail +2 | while read t; do echo "drop table \`$t\`;"; done | mysql
11
Rafael Kitover

クエリに一致するテーブルがない場合にエラーを生成しないように、DevartのソリューションにIFNULLを追加すると便利だと思いました。

SET @tables = IFNULL(CONCAT('DROP TABLE ', @tables),'SELECT NULL;');
1
A C