web-dev-qa-db-ja.com

DROPデータベースのパーミッションなしでコマンドラインから全てのMySQLテーブルを削除する方法?

コマンドプロンプトを使用して、Windows MySQLのすべてのテーブルを削除する方法を教えてください。私がこれをしたいのは私達のユーザーがデータベースドロップへのアクセス権を持っていますが、データベース自体を再作成するアクセス権がないからです。一度にすべてのテーブルを削除する方法はありますか?ほとんどのテーブルは外部キーとリンクされているため、特定の順序で削除する必要があります。

208
Mantas

DROP TABLE t1, t2, t3, ...のように文を生成し、それを実行するために準備された文を使用することができます。

SET FOREIGN_KEY_CHECKS = 0; 
SET @tables = NULL;
SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables
  FROM information_schema.tables 
  WHERE table_schema = 'database_name'; -- specify DB name here.

SET @tables = CONCAT('DROP TABLE ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1; 
295
Devart

@ Devartのバージョンは正しいですが、ここでエラーを回避するためのいくつかの改善点があります。 @ Devartの回答を編集しましたが、受け入れられませんでした。

SET FOREIGN_KEY_CHECKS = 0;
SET GROUP_CONCAT_MAX_LEN=32768;
SET @tables = NULL;
SELECT GROUP_CONCAT('`', table_name, '`') INTO @tables
  FROM information_schema.tables
  WHERE table_schema = (SELECT DATABASE());
SELECT IFNULL(@tables,'dummy') INTO @tables;

SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;

少なくとも1つの存在しない「ダミー」テーブルを追加してデータベース内のすべてのテーブルをすでに削除している場合、このスクリプトはNULLの結果でエラーを発生させません。

そして、あなたがたくさんのテーブルを持っているとき、それは念のために修正されました。

そして、すべてのビューを削除するというこの小さな変更はデータベースに存在します。

SET FOREIGN_KEY_CHECKS = 0;
SET GROUP_CONCAT_MAX_LEN=32768;
SET @views = NULL;
SELECT GROUP_CONCAT('`', TABLE_NAME, '`') INTO @views
  FROM information_schema.views
  WHERE table_schema = (SELECT DATABASE());
SELECT IFNULL(@views,'dummy') INTO @views;

SET @views = CONCAT('DROP VIEW IF EXISTS ', @views);
PREPARE stmt FROM @views;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;

削除したいデータベースからスクリプトを実行すると仮定します。またはこれを実行する前に:

USE REPLACE_WITH_DATABASE_NAME_YOU_WANT_TO_DELETE;

バッククォートの問題を発見してくれたSteve Horvathに感謝します。

262
Kostanos

これを試して。

これは制約(外部キー関係)を持つテーブルに対しても機能します。あるいは、単にデータベースをドロップして再作成することもできますが、それを実行するために必要な権限がない可能性があります。

mysqldump -u[USERNAME] -p[PASSWORD] \
  --add-drop-table --no-data [DATABASE] | \
  grep -e '^DROP \| FOREIGN_KEY_CHECKS' | \
  mysql -u[USERNAME] -p[PASSWORD] [DATABASE]

外部キーチェックの効果を克服するために、生成されたスクリプトの最後にshow tableを追加し、show tableコマンドが空のセットになるまで何度も実行します。

73
MutantMahesh

あなたは drop the databasename__、そして 作り直すことができます それは以下で: -

mysql> drop database [database name];
mysql> create database [database name];
44
user1086159

受け入れられた答えは、多数のテーブルを持つデータベース、例えばDrupalデータベース代わりに、次のスクリプトを参照してください。 https://stackoverflow.com/a/12917793/1507877 これはMySQL 5.5で動作します。注意:11行目の周りには、 "WHERE table_schema = SCHEMA();"があります。これは、代わりに「WHERE table_schema = 'インポートが発生するDBの名前を挿入' '」である必要があります。

6
Giles B