2016-08-23 8 views
2

Можно ли удалять таблицы с 10 записями в одном выражении, используя инструкцию вроде этого?Удалить таблицы, имеющие ровно 10 строк в MySQL

.. DROP TABLE ... WHERE name IN 
(SELECT table_name FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'my_db' AND table_rows = 10); 
+0

Нет нет нет нет нет нет нет – RiggsFolly

+0

Вам нужно будет написать динамический SQL в хранимой процедуре. – Barmar

ответ

2

Прежде всего, не доверяют table_rows в INFORMATION_SCHEMA.TABLES. Это оценка , это неточно. Как это могло быть точным, учитывая, что в любой момент могут быть транзакции, не допущенные, чтобы вставлять или удалять строки? Количество строк в таблице может включать или не включать эти изменения.

Во-вторых, оператор DROP 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 или каких-либо условий. Вы должны явно указать таблицы.

Вы должны разработать привычку читать документацию, чтобы узнать, какой синтаксис поддерживается. Это самая большая жалоба на вопросы о переполнении стека: слишком много людей пропускают чтение справочной документации. 90% или более вопросов здесь не понадобятся, если они это сделают.

Как комментарии @Barmar выше, вы можете prepare a dynamic SQL statement со списком таблиц, которые вы хотите удалить.

В-третьих, сброс неопределенного набора таблиц очень опасен. Вы можете сбросить неправильные таблицы из-за ошибки в коде, который находит таблицы, соответствующие критериям. Это обязательно создаст катастрофу потери данных, из которой невозможно восстановить. Я никогда не «автоматизирую» падение таблиц.