在 MySQL 中删除正好有 10 行的表
Delete tables having exactly 10 rows in MySQL
是否可以使用这样的语句在单个语句中删除包含 10 条记录的表?
.. DROP TABLE ... WHERE name IN
(SELECT table_name FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'my_db' AND table_rows = 10);
首先,不要相信INFORMATION_SCHEMA.TABLES中的table_rows
。这是一个估计,并不精确。考虑到在任何给定时刻,可能有未提交的插入或删除行的事务,它怎么可能精确呢? table 中的行数可能包含也可能不包含这些更改。
其次,DROP TABLE
语句只支持删除一个固定的table列表。这是 http://dev.mysql.com/doc/refman/5.7/en/drop-table.html:
的语法参考
DROP [TEMPORARY] TABLE [IF EXISTS]
tbl_name [, tbl_name] ...
[RESTRICT | CASCADE]
此声明不支持 WHERE
子句或任何条件。您必须明确命名 table。
您应该养成阅读文档的习惯,以了解支持的语法。这是我对 Stack Overflow 问题最大的抱怨:太多人跳过阅读参考文档。如果他们这样做,这里 90% 或更多的问题都是不必要的。
正如上面@Barmar 评论的那样,您可以 prepare a dynamic SQL statement 使用要删除的 table 列表。
第三,丢弃一组不确定的 tables 是非常危险的。您可能会丢弃错误的 tables,因为您的代码中存在一个错误,该错误会找到符合条件的 tables。这肯定会造成无法恢复的数据丢失灾难。我从来没有 "automate" table 的下降。
是否可以使用这样的语句在单个语句中删除包含 10 条记录的表?
.. DROP TABLE ... WHERE name IN
(SELECT table_name FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'my_db' AND table_rows = 10);
首先,不要相信INFORMATION_SCHEMA.TABLES中的table_rows
。这是一个估计,并不精确。考虑到在任何给定时刻,可能有未提交的插入或删除行的事务,它怎么可能精确呢? table 中的行数可能包含也可能不包含这些更改。
其次,DROP TABLE
语句只支持删除一个固定的table列表。这是 http://dev.mysql.com/doc/refman/5.7/en/drop-table.html:
DROP [TEMPORARY] TABLE [IF EXISTS]
tbl_name [, tbl_name] ...
[RESTRICT | CASCADE]
此声明不支持 WHERE
子句或任何条件。您必须明确命名 table。
您应该养成阅读文档的习惯,以了解支持的语法。这是我对 Stack Overflow 问题最大的抱怨:太多人跳过阅读参考文档。如果他们这样做,这里 90% 或更多的问题都是不必要的。
正如上面@Barmar 评论的那样,您可以 prepare a dynamic SQL statement 使用要删除的 table 列表。
第三,丢弃一组不确定的 tables 是非常危险的。您可能会丢弃错误的 tables,因为您的代码中存在一个错误,该错误会找到符合条件的 tables。这肯定会造成无法恢复的数据丢失灾难。我从来没有 "automate" table 的下降。