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

S
На сайте с 06.08.2008
Offline
130
6294

В БД MySQL ежедневно создаются таблицы с логами. Имена таблиц выглядят так:

logs_2012_05_12

logs_2012_05_13

logs_2012_05_14

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

siv1987
На сайте с 02.04.2009
Offline
427
#1
S
На сайте с 06.08.2008
Offline
130
#2

Синтаксис я знаю. Вы внимательно вопрос прочитайте!

siv1987
На сайте с 02.04.2009
Offline
427
#3

Вопрос я внимательно читал, поэтому и дал вам синтаксис.

Одним запросом? Заходите в phmyadmin, отмечаете нужные вам таблицы и удаляете одним нажатием.

Либо при помощью php скрипта, запрашиваете имена таблиц http://dev.mysql.com/doc/refman/5.0/en/show-tables.html, отбираете нужные и составляете запрос для их удаления.

S
На сайте с 06.08.2008
Offline
130
#4

Проблема в том, что таблицы должны дропаться автоматом (крон). И удалять нужно не все таблицы младше сегодняшнего дня, а с конкретными именами..

Можно и не одним запросом, если это возможно..

siv1987
На сайте с 02.04.2009
Offline
427
#5

Ну так в чем проблема? По вашему условию вполне осуществимая задача. Вот вам примерный шаблон такого скрипта


$tdel = array();
$res = mysql_query( 'SHOW TABLES' );
while( $t = mysql_fetch_row( $res ) )
{
if( preg_match('/^logs_(\d+_\d+_\d+)$/', $t[0], $tdate) )
{
if( $tdate[1] < date( 'Y_m_d' ) )
{
$tdel[] = $t[0];
}
}
}
if( count($tdel) )
{
mysql_query( 'DROP TABLE '.implode( ',', $tdel ) );
}

Зы. Как правильно отработает условие $tdate[1] < date( 'Y_m_d' ) я точно не знаю, поэтому лучше ее протестировать.

S
На сайте с 06.08.2008
Offline
130
#6

Ругается на

if( preg_match('/^logs_(\d+_\d+_\d+)$/', $t, $tdate) )
Warning: preg_match() expects parameter 2 to be string, array given in
siv1987
На сайте с 02.04.2009
Offline
427
#7

вместо $t => $t[0]

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий