Как одним запросом удалить несколько таблиц?

Тема в разделе "Базы данных", создана пользователем spiderbuber, 14 май 2012.

Модераторы: latteo
  1. spiderbuber

    spiderbuber

    Заблокирован
    Регистр.:
    20 июл 2009
    Сообщения:
    237
    Симпатии:
    61
    В БД MySQL ежедневно создаются таблицы с логами. Имена таблиц выглядят так:
    logs_2012_05_12
    logs_2012_05_13
    logs_2012_05_14

    Каким SQL запросом можно удалить все таблицы дата которых меньше сегодняшней? Т.е. таблица logs_2012_05_14 должна остаться (до завтра), а все остальные удалиться..
     
  2. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    79
    Для одного запроса боюсь нужно будет писать хранимую процедуру.
    Получить список таблиц можно запросом:

    Код:
    SELECT
      `information_schema`.`tables`.`table_name`
    FROM
      `information_schema`.`tables`
    WHERE
      update_time < date_sub(NOW(), INTERVAL 1 DAY)
    Далее можно объединить их, например, через запятую
    и удалить вторым запросом
    Код:
    DROP TABLE tbl_name_1, table_name_2, ...
     
  3. spiderbuber

    spiderbuber

    Заблокирован
    Регистр.:
    20 июл 2009
    Сообщения:
    237
    Симпатии:
    61
    Проблема в том, что таблицы должны дропаться автоматом (крон). И удалять нужно не все таблицы младше сегодняшнего дня, а с конкретными именами..
     
  4. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    79
    Кроном можно запустить, например, php- или bash-скрипт. Для удаления таблиц с определенными именами можно чуть изменить запрос:
    Код:
    SELECT
      `table_name`
    FROM
      `information_schema`.`tables`
    WHERE
      update_time < date_sub(NOW(), INTERVAL 1 DAY)
    AND
      `table_name` LIKE "logs\_____\___\___"
     
    spiderbuber нравится это.
  5. spiderbuber

    spiderbuber

    Заблокирован
    Регистр.:
    20 июл 2009
    Сообщения:
    237
    Симпатии:
    61
    Спасибо за старания, но так и не смог разобраться..
    Решил удалять таблицу вчерашней даты так:
    ЗЫ: Но всё-таки интересен вопрос как удалить все таблицы с датой меньше сегодняшней..
     
  6. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.520
    Симпатии:
    1.368
    Для аналогичной задачи (имена таблиц log_2011-09-04) использовал такой код:

    PHP:
    $arch_day 3;                        //Сколько хранить архивов
     
     
    # Удаление таблиц дневной статистики, которые старше чем хотелось бы
    $res_arcta mysql_query("SHOW TABLES LIKE 'log\_%'");
    while (
    $rows mysql_fetch_array($res_arcta)) {
    $table_del_candidat $rows[0];
    $table_name explode('_'$table_del_candidat);
    $lastdate strftime("%Y-%m-%d"strtotime(date('Y-m-d')."-".$arch_day." day"));
    if (
    $table_name[1] <= $lastdate) {
    mysql_query("drop table `".$table_del_candidat."`");
    //echo $table_del_candidat.'-deleted-!<br>';
    }
    }
    В качестве оптимизации можно $table_del_candidat делать массивом и удалять по несколько таблиц
    DROP TABLE tbl_name_1, table_name_2
     
    spiderbuber нравится это.