我有一个表的信息模式,比如它包含
aaaa_tale
bbbb_table
cccc_table
dddd_table
我有另一个包含表名列表的表。
cccc_table
bbbb_table
我是否可以执行一个命令,允许我删除包含表名的表中未找到的模式中的表?所以之后只有aaaa_table和dddd_table留在架构中。
答案 0 :(得分: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(请参阅问题的倒数第二句,特别是"请允许我删除表格中的表格在包含表名")的表中找不到的模式。
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时,存储过程才允许您执行条件块。