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

我有一个数据库,其中条目插入到带有时间戳的表中(来自 PHP 的 time() 的 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子句。那么我想要的结果如何实现呢?

标签: php mysql sql drop-table


【解决方案1】:

您尝试过的方法不起作用 - 您将data definition statementsdata 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,所以很抱歉浪费您的时间)
猜你喜欢
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 2020-06-30
  • 2012-03-04
  • 2016-12-07
  • 2012-01-15
  • 2011-02-08
相关资源
最近更新 更多