私はテーブルの情報スキーマを持っています。
aaaa_tale
bbbb_table
cccc_table
dddd_table
テーブル名のリストを含む別のテーブルがあります。
cccc_table
bbbb_table
テーブル名を含むテーブルに見つからないスキーマ内のテーブルを削除できる実行可能なコマンドはありますか? そのため、その後 aaaa_table と dddd_table だけがスキーマに残ります。
私はテーブルの情報スキーマを持っています。
aaaa_tale
bbbb_table
cccc_table
dddd_table
テーブル名のリストを含む別のテーブルがあります。
cccc_table
bbbb_table
テーブル名を含むテーブルに見つからないスキーマ内のテーブルを削除できる実行可能なコマンドはありますか? そのため、その後 aaaa_table と dddd_table だけがスキーマに残ります。
ドロップしないテーブルのリストを持つテーブルの名前が「table_list」で、そのリストが「table_name」列にあるとします。純粋な SQL を使用する場合は、スキーマに保持するテーブルに応じて、次のいずれかを実行できます (質問からは明らかではありません)。
ケース: aaaa_table と dddd_table だけが残るように、テーブルのリストにリストされているテーブルを削除したい (質問の最後の文を参照)。
SET GROUP_CONCAT_MAX_LEN=10000; /* Adjust this as per your requirement */
SELECT CONCAT( 'DROP TABLE ',
GROUP_CONCAT(TABLE_NAME) ) INTO @drop_query
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = database()
AND TABLE_NAME IN (SELECT table_name from table_list);
SET @drop_query = IFNULL(@drop_query, 'SELECT 1');
PREPARE drop_statement FROM @drop_query;
SET foreign_key_checks = 0;
EXECUTE drop_statement;
SET foreign_key_checks = 1;
DEALLOCATE PREPARE drop_statement;
ケース: cccc_table と dddd_table のみが残るように、テーブルのリストにリストされているテーブルを保持したい場合 (質問の最後から 2 番目の文を参照してください。テーブル名を含むテーブル」)。
SET GROUP_CONCAT_MAX_LEN=10000; /* Adjust this as per your requirement */
SELECT CONCAT( 'DROP TABLE ',
GROUP_CONCAT(TABLE_NAME) ) INTO @drop_query
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = database()
AND TABLE_NAME NOT IN (SELECT table_name from table_list);
SET @drop_query = IFNULL(@drop_query, 'SELECT 1');
PREPARE drop_statement FROM @drop_query;
SET foreign_key_checks = 0;
EXECUTE drop_statement;
SET foreign_key_checks = 1;
DEALLOCATE PREPARE drop_statement;
どちらの場合も、ハックを回避して NULL をチェックし、見つかった場合は、ストアド プロシージャを使用して上記のコードのダミー クエリ ("SELECT 1") に置き換えます。ストアド プロシージャでは、@drop_query が NULL でない場合にのみ、条件付きブロックを実行できます。