MySQL « Удаление таблиц по маске

Стоит мультиюзерный WordPress. У некоторых пользователей стоял плагин, который создавал по три таблицы вида:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .ini.geshi_code {font-family:monospace;} .ini.geshi_code .imp {font-weight: bold; color: red;} .ini.geshi_code .co0 {color: #666666; font-style: italic;} .ini.geshi_code .sy0 {color: #000066; font-weight:bold;} .ini.geshi_code .st0 {color: #933;} .ini.geshi_code .re0 {color: #000066; font-weight:bold;} .ini.geshi_code .re1 {color: #000099;} .ini.geshi_code .re2 {color: #660066;} .ini.geshi_code span.xtra { display:block; }

wp_1_myStat_data
wp_1_myStat_dbsize
wp_1_myStat_main
 

где 1 - это номер блога. Поясню, что в мультиюзерном WP на каждый зарегистрированный в системе блог создается пачка таблиц как для отдельного WP-блога с тем лишь различием, что в имени присутствует номер блога (в данном случае 1).

Плагин оказался плохонький, и его решили удалить. Удалили, а таблицы остались. Теперь проблема найти все таблицы такого вида в базе (кто-то из пользователей юзал плагин, а кто-то нет) и удалить.
Подскажите пожалуйста, как это сделать.

1 ответов


Если бы это был PostgreSQL, и использовались схемы, то я бы посоветовал дропнуть схему. Но не судьба.

Насколько мне известно, операторы модификации схемы (CREATE, ALTER, DROP : TABLE, VIEW...) позволяют удалять только конкретный объект. Вообще говоря, на месте имён объектов не могут быть использованы строковые литералы.
Следовательно нужно прибегнуть к динамическому SQL, а именно написать скрипт на языке программирования, который обходит коллекцию имён и дропает все объекты по очереди.


$blogs = range(1, 10); // некоторые блоги
foreach ($blogs as $blogNum) {
   $q = array("wp_{$blogNum}_myStat_data", "wp_{$blogNum}_myStat_dbsize", "wp_{$blogNum}_myStat_main");
   foreach ($q as $name) {
      // Тут команда execute
      $connect->execute("DROP TABLE {$name};");
   }
}
 

В Mysql можно опросить служебную таблицу INFORMATION_SCHEMA.TABLES и получить список таблиц . что-то типа


  SELECT table_schema, table_name
  FROM INFORMATION_SCHEMA.TABLES
  WHERE table_name like 'wp_%_myStat_%'
 
и потом в цикле удалить каждую таблицу.