MySQL 和 PHP DROP TABLE 基于表中的值

Posted

技术标签:

【中文标题】MySQL 和 PHP DROP TABLE 基于表中的值【英文标题】:MySQL and PHP DROP TABLE based on value in table 【发布时间】:2014-03-24 20:38:21 【问题描述】:

我有一个数据库,其中条目插入到带有时间戳的表中(来自 phptime() 的 int 不是 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 中循环遍历每个表并在必要时将其删除?

【问题讨论】:

DROP TABLE 命令上没有 WHERE 子句。确定要删除表而不是删除行吗? 我打赌这可以在存储过程中使用循环中的准备好的语句来完成。 dev.mysql.com/doc/refman/5.5/en/… 我应该在发布之前查看 drop table 的语法。我的错。你是对的,它没有where子句。那么我想要的结果如何实现呢? 【参考方案1】:

您尝试过的方法不起作用 - 您将data definition statements 与data manipulation statements 混合使用。

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

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

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

【讨论】:

虽然,再想一想,“如果存在则删除表...”应该没问题,因为无论如何您都希望将其删除。【参考方案2】:

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

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

【讨论】:

在发布这个问题后,我昨天实际上实现了类似的东西。很抱歉没有接受您的回答;虽然两个答案都是正确的,但我接受了第一个,因为它是当时唯一的一个。 (这整个问题是不必要的,因为我可以简单地在 MySQL 文档中查找 DROP,所以很抱歉浪费您的时间)

以上是关于MySQL 和 PHP DROP TABLE 基于表中的值的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 8.0 drop table恢复

MySQL 8.0 drop table恢复

MySQL DROP TABLE操作以及 DROP 大表时的注意事项

mysql drop table 卡住 怎么办

MySQL--DROP TABLE与MySQL版本

删除MySQL表的SQL语句-DROP-TABLE-简介