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

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

4

6 に答える 6

65

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

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;
于 2012-06-15T14:59:25.817 に答える
21

@Devartの回答に対するマイナーな改善:

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私がコメントした切り捨ての問題を回避するためにa を追加しました
  3. select @tables;スクリプトの実行をいつ停止するかを制御するために、「印刷」( ) を追加しました。
于 2013-08-18T14:12:24.523 に答える
14

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

echo "show tables like 'fsm%'" | mysql | tail +2 | while read t; do echo "drop table \`$t\`;"; done | mysql
于 2013-02-02T01:22:45.127 に答える
2

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

SET @tables = IFNULL(CONCAT('DROP TABLE ', @tables),'SELECT NULL;');
于 2015-07-01T19:07:22.447 に答える