MySQL и PHP DROP TABLE в зависимости от значения в таблице

У меня есть база данных, где записи вставляются в таблицы с отметкой времени (int из PHP time() не отметка времени SQL). Я хочу сделать запрос, чтобы удалить все таблицы, где наибольшая временная метка меньше времени истечения (некоторое время с момента выполнения запроса). Сейчас у меня есть

$q = mysqli_query(..., "SHOW TABLES LIKE 'prefix%'");
if($q===FALSE) die(mysqli_error(...));
for($row in mysqli_fetch_array($q)){
    $slice = array_slice($row, 0, 1);
    $tbl = array_shift($slice);
    mysqli_query(..., "DROP TABLE `$tbl` WHERE ((SELECT GREATEST (SELECT `time` FROM `$tbl`)) <= $expiry_time)");
}

Это дает ошибку синтаксиса SQL.

Как правильно достичь этого? Кроме того, возможно ли устранить логику PHP и просто перебрать каждую таблицу и, при необходимости, удалить ее в SQL?

2 ответа

Решение

Испытанный вами подход не сработает - вы смешиваете операторы определения данных с операторами манипулирования данными.

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

Таким образом, перед вами стоит выбор: делать это в MySQL с помощью хранимой процедуры (которая, на мой взгляд, как бы скрывает реализацию) или делать это на PHP (где код, вероятно, будет более доступным и понятным).

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

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

$q = mysqli_query(..., "SHOW TABLES LIKE 'prefix%'");
if($q===FALSE) die(mysqli_error(...));
for($row in mysqli_fetch_array($q)){
    $slice = array_slice($row, 0, 1);
    $tbl = array_shift($slice);
$r = mysqli_query(..., "SELECT MAX(`time`) FROM $tbl HAVING MAX(`time`) <= $expiry_time");
    if ($r) { 
     mysqli_query(..., "DROP TABLE $tbl");
    }
}
Другие вопросы по тегам