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");
}
}