Удалить таблицы, которых нет в списке? - PullRequest
3 голосов
/ 04 мая 2011

Мне нужно сбросить около 20 тыс. Таблиц.Я знаю имена таблиц, которые НЕ должны быть удалены.

Если у меня есть имена таблиц "a, b, c, d, e, f, g ...", как я могу удалить все таблицычто нет в списке "а, б, в"?

Ответы [ 7 ]

3 голосов
/ 04 мая 2011

Вы можете получить список с этим

SELECT CONCAT("DROP TABLE ", table_name, ";") 
FROM information_schema.TABLES 
WHERE table_schema = <whatever your db name is> 
AND table_name NOT IN (<your list>);

Затем скопируйте и вставьте!

2 голосов
/ 04 мая 2011

Попробуйте получить набор результатов операторов SQL DROP:

SELECT CONCAT('DROP TABLE ', TABLE_NAME , ';')
FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_SCHEMA='YourDatabase'
AND TABLE_NAME NOT IN ('Table1', 'Table2');

Скопируйте и вставьте результаты, и вы получите 20 000- n операторов DROP.

2 голосов
/ 04 мая 2011

Я бы посоветовал вам воспользоваться следующим подходом

  • извлечь полный список всех таблиц по одной таблице на строку с SHOW TABLES (или из information_schema.TABLES)
  • открыть список в текстовом редакторе
  • удалить таблицы, которые вы не хотите удалять из списка
  • использовать макрос или поиск / замену, чтобы превратить каждую строку в DROP TABLEкоманда

Теперь у вас есть сценарий SQL, который вы можете запустить с базой данных

Если вы оболочка Linux, то ниндзя может захотеть использовать такие инструменты командной строки, как uniq, xargs и т. д. для работы с файлами.Использование электронной таблицы может быть еще одним способом борьбы с ней.

1 голос
/ 04 мая 2011

Вам нужно запустить select из information_schema.tables и создать курсор, который будет перебирать результаты и выполнять соответствующие отбрасывания (используйте оператор if).Это связано с тем, что оператор drop не поддерживает выбор / фильтрацию или другие параметры.(если что-то не изменилось за последние два или три года)

Когда вы выполняете оператор выбора, вы можете использовать что-то вроде:

WHERE table_name NOT IN ('ssss','dddd');

Другое дело: почему у вас есть20к таблиц в твоей базе ?????

0 голосов
/ 05 февраля 2016

Есть гораздо более простой способ.В одной строке введите в командной строке:

mysql -u root -p[password] --skip-column-names [database] -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='[database]' AND TABLE_NAME NOT IN ('[table 1]', '[table 2]',..'[table n]');" | cut -f1 | sed -r 's/(.*)/DROP TABLE IF EXISTS \1;/' | mysql -u root -p[password] [database]

Вы можете получить два предупреждения о включении паролей в команду.Если это может быть проблемой, вы можете очистить историю команд, чтобы «удалить доказательства»: -)

history -c
0 голосов
/ 01 октября 2015

Я столкнулся с точно такой же проблемой сегодня.Вот один из подходов для пропуска таблиц ABC, DEF и XYZ:

mysql -Nu USER --password=PASSWORD DATABASE -e 'show tables' | \
perl -ne 'BEGIN { print "SET FOREIGN_KEY_CHECKS=0;\n" };
    !/^(ABC|DEF|XYZ)$/ && s/^(.*)/DROP TABLE `\1`;/ && print' | \
mysql -u USER --password=PASSWORD DATABASE

Так, что, черт возьми, все это?

  1. Первый вызов mysql возвращает все таблицы без строки заголовка (опция -N)
  2. Вывод mysql передается в Perl
  3. Сценарий Perl добавляетпервая строка для пропуска проверок внешнего ключа, так как мы отбрасываем таблицы
  4. Затем скрипт добавляет DROP TABLE X для каждой таблицы, пропуская таблицы ABC, DEF и XYZ
  5. Вывод из Perl идетв MySQL, изменяя ту же базу данных
0 голосов
/ 04 мая 2011

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

  • Резервное копирование таблиц, которые вы хотите сохранить
  • DROP DATABASE база данных со всеми таблицами в
  • Восстановление таблиц, которые вы хотите сохранить из резервных копий
...