0

我有一个数据库,其中条目插入到带有时间戳的表中(来自 PHP 的 inttime()不是 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 中?

4

2 回答 2

1

您尝试过的方法不起作用- 您将数据定义语句数据操作语句混合在一起。

您可能可以在 MySQL 的存储过程中执行此操作,但我还没有尝试过。

所以你面临一个选择:通过存储过程在 MySQL 中执行(在我看来,这有点隐藏了实现)或在 PHP 中执行(代码可能更易于访问和理解)。

请注意,在任何一种情况下,您都可能需要锁定表,以防止表在查询(查找时间戳值)和删除表之间消失。

于 2014-03-24T20:46:18.553 回答
0

我不认为你接受的答案是正确的。我在你的代码中添加了一些逻辑,这会给你你想要的。

$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");
    }
}
于 2014-03-25T06:50:54.867 回答