約 20k テーブルを削除する必要があります。ドロップしてはならないテーブルの名前を知っています。
テーブル名が「a、b、c、d、e、f、g...」の場合、リスト「a、b、c」にないすべてのテーブルを削除するにはどうすればよいですか?
これでリストを取得できます
SELECT CONCAT("DROP TABLE ", table_name, ";")
FROM information_schema.TABLES
WHERE table_schema = <whatever your db name is>
AND table_name NOT IN (<your list>);
次に、コピーして貼り付けます!
次のアプローチを取ることをお勧めします
SHOW TABLES
を使用して(または からinformation_schema.TABLES
) 、すべてのテーブルの完全なリストを 1 行に 1 つずつ抽出します。DROP TABLE
コマンドに変換しますこれで、データベースに対して実行できる SQL スクリプトができました
あなたが Linux シェルの忍者ならuniq
、xargs
、 などのコマンドライン ツールを使用してファイルを操作することをお勧めします。スプレッドシートを使用することは、それに対処する別の方法かもしれません。
これを試して、SQL DROP ステートメントの結果セットを取得します。
SELECT CONCAT('DROP TABLE ', TABLE_NAME , ';')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='YourDatabase'
AND TABLE_NAME NOT IN ('Table1', 'Table2');
結果をコピーして貼り付けると、20,000 -n 個のDROP ステートメントが得られます。
select from information_schema.tables を実行し、結果を反復して適切なドロップを実行するカーソルを作成する必要があります (if ステートメントを使用)。これは、drop ステートメントが選択/フィルタリングまたはその他のオプションをサポートしていないためです。(ここ2、3年で何かが変わった場合を除く)
select ステートメントを実行しているときは、次のようなものを使用できます。
WHERE table_name NOT IN ('ssss','dddd');
もう 1 つは、なぜデータベースに 2 万個のテーブルがあるのですか?????
今日、まったく同じ問題に遭遇しました。テーブル ABC、DEF、および XYZ をスキップするための 1 つの方法を次に示します。
mysql -Nu USER --password=PASSWORD DATABASE -e 'show tables' | \
perl -ne 'BEGIN { print "SET FOREIGN_KEY_CHECKS=0;\n" };
!/^(ABC|DEF|XYZ)$/ && s/^(.*)/DROP TABLE `\1`;/ && print' | \
mysql -u USER --password=PASSWORD DATABASE
それで、悪魔とは何ですか?
短期間使用不可にしたいテーブルを回避できる場合は、まったく異なるアプローチを提案します。
DROP DATABASE
すべてのテーブルを含むデータベース