2012-06-15 6 views
19
DROP TABLE (
SELECT table_name 
FROM information_schema.`TABLES` 
WHERE table_schema = 'myDatabase' AND table_name LIKE BINARY 'del%'); 

これは機能しません。 SQLでこれと同等のものは何ですか?私はこれを行うために単純なPythonスクリプトを用意することができますが、SQLで直接何かできるかどうか疑問に思っていました。私はMySQLを使用しています。ありがとうございました!MySQLのバルクドロップテーブルのようなテーブル?

答えて

35

あなたはprepared statements使用することができます - それは、このような文を生成し、実行します

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; 
+0

DBA StackExchange http://dba.stackexchange.com/a/1369/877でも同様の回答がありました。 Prepared Statement Usageの+1 – RolandoMySQLDBA

+0

私はこれまでに準備されたステートメントを使用していません。私にそれをする新しい方法を教えてくれてありがとう! – ThinkCode

+0

私はDROP TABLEコマンドをMySQLが実際にPREPAREで実行できる形式にするのに苦労しました。これは、混乱をクリアし、不思議に役立ちました:) – RKeast

8

あなただけ早く(ない純粋なSQLでテーブルの束をドロップする必要がある場合は、この質問に直接答えることはできません)。1行のシェルコマンドで実行できます。

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

'tail + 2'はUbuntu上で動作しませんでした。' tail -n + 2'にする必要がありました。 – STW

+1

代わりに 'mysql -N'を' tail'を使ってやめてください。 – Igor

11

マイナーな修正テーブル名を包む

  1. バッククォート( `)(それ以外が含まれている場合:@Devart's answerにvement:コンソールの出力がNULL

    変更があるになるまで

    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; 
    

    このスクリプトを繰り返し実行する必要があります

  2. が追加されました。私がコメントした切り捨ての問題を避けるためLIMIT
  3. は、私が一致するテーブルが存在しない場合は、エラーの発生を回避するためにDevartのソリューションにIFNULLを追加することが有用であることが分かったスクリプト
+0

+1元の回答よりも改善。しかし、制限を10とすると、一度に処理できるテーブルは10個だけになりますか? – MJoraid

+0

@ヨライド、そうです。スクリプトの使用コメントに注意してください。「このスクリプトは、コンソールの出力がNULLになるまで繰り返し実行する必要があります。つまり、 'LIMIT'が追加されて何度も繰り返す必要があります。 –

+0

エラーが発生しています。 ERROR 1064(42000):SQL構文にエラーがあります。あなたのMySQLサーバのバージョンに対応するマニュアルを調べて、正しい構文が第1行目の 'NULL'近くで使用するようにしてください –

1

の実行を停止したときにコントロールのいくつかの種類を持っているために、「印刷」(select @tables;)を追加しましたクエリ。

SET @tables = IFNULL(CONCAT('DROP TABLE ', @tables),'SELECT NULL;'); 
関連する問題