繁体   English   中英

MySQL:如果找不到表名,则从架构中删除特定表?

[英]MySQL: Dropping specific tables from a schema if tablename not found?

我有一个表的信息模式,说它包含

aaaa_tale
bbbb_table
cccc_table
dddd_table

我还有另一个包含表名列表的表。

cccc_table
bbbb_table

我是否可以执行一个命令,使我可以删除架构中包含表名的表中找不到的表? 因此,此后仅将aaaaa_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(请参阅问题的倒数第二句,尤其是“允许我将表中未包含在表中的表删除包含表名的表”)。

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时,存储过程才允许您执行条件块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM