0

私はテーブルの情報スキーマを持っています。

aaaa_tale
bbbb_table
cccc_table
dddd_table

テーブル名のリストを含む別のテーブルがあります。

cccc_table
bbbb_table

テーブル名を含むテーブルに見つからないスキーマ内のテーブルを削除できる実行可能なコマンドはありますか? そのため、その後 aaaa_table と dddd_table だけがスキーマに残ります。

4

1 に答える 1

0

ドロップしないテーブルのリストを持つテーブルの名前が「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 でない場合にのみ、条件付きブロックを実行できます。

于 2016-08-30T11:01:11.910 に答える