SQL перебирает таблицы и удаляет, если не определено имя - PullRequest
1 голос
/ 07 июля 2011

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

Итак, у меня есть 3 таблицы, которые я не хочу отбрасывать.

Какой оператор SQL я могу использовать для этого? Я давно гуглю, но ничего не вышло!

Итак, я имею в виду нечто подобное (в PHP):

foreach($tab as $tableList){
if($tab!='foo'&&$tab!='bar'&&$tab!='foofoobar')
mysql_query('DROP TABLE '.$tab);
}

Есть идеи? еще лучше, если бы все могло быть заявлением mysql!

Ответы [ 3 ]

3 голосов
/ 07 июля 2011
SELECT table_name
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = 'db_name'

выдаст вам все таблицы в базе данных 'db_name'.

Не забудьте сделать резервную копию ваших таблиц перед выполнением операторов DROP.

Вы можете использовать PHP длявыполнить операторы DROP или динамический SQL с чем-то вроде этого:

(скопировано из этого вопроса: Удаление динамически управляемых таблиц в mysql )

SET @v = ( SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(it.table_name) )
           FROM information_schema.tables it 
           WHERE it.table_name NOT IN ('TableToKeep_1', 'Keep_2', 'Keep_3')
             AND it.table_schema = 'db_name' ;
         ) ;
PREPARE stDropTables FROM @v; 
EXECUTE stDropTables ;
2 голосов
/ 07 июля 2011

из вашего PHP-кода, я думаю, вы должны использовать OR не AND ...

foreach($tab as $tableList){
if($tab!='foo'|| $tab!='bar' || $tab!='3rdtablename')
mysql_query('DROP TABLE '.$tab);
}

по понятной причине.

хорошо, если вы хотите сделать это в MySQL,

вы можете сначала перечислить все таблицы ... используя

show tables > whateverfile.txt

и сохранить в файле ... отредактируйте файл по необходимости ... т.е. удалите имена таблиц, которые не следует удалять, и добавьте DROP TABLE в первую строку файла выполнить его в MysQL ... mysql < whateverfile.txt ....

2 голосов
/ 07 июля 2011

Вы можете удалить более одной таблицы одновременно, используя запятую.

     DROP TABLE table_1, table_2, etc;
...