删除文件&;MySQL结果集中的行


Delete files & rows from a MySQL result set

我有一个Linux盒子,它可以捕获数据、创建文件并将有关文件的数据存储在MySQL表中。我需要能够有选择地开始修剪数据。

我计划使用php-cli脚本,并通过cron每晚运行它。

基本前提是选择符合删除条件的行,从匹配的行中删除文件,然后删除行。路径/文件名存储在行中。

我发现以下查询可以安全地选择,然后删除行,但我需要从文件系统中删除结果中的文件:

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT foo FROM bar WHERE wee = 'yahoo!';
DELETE FROM bar WHERE wee = 'yahoo!';
COMMIT;

我知道如何使用php的unlink()函数删除文件。我只是不知道如何保留结果集,迭代删除文件,然后从表中删除结果集行。。。而不需要对临时文本文件或其他内容进行大而丑陋的破解。

如有任何帮助,我们将不胜感激。谢谢

编辑:PHP 5.3.6,MySQL 5.0.77

如果您只是启动1个DELETE查询,我认为您不需要事务。

<?php
    $pdo::prepare("SELECT [...]");
    foreach($result as $pathname) {
      unlink($pathname);
      if (/*everything went good*/)
        $pdo::prepare("DELETE [...]");
    }

?>

我认为您实际上没有问题。您可以选择所有记录并对其进行迭代。一旦执行了查询,就可以对结果集中的每个记录进行迭代,即使使用第二个查询删除它们也是如此。当你对结果集进行迭代时,它会被保存在内存中

因此,只需查询(如果是possble,则在一个查询中)所有要删除的记录。在每次迭代中,删除文件并删除该记录。

唯一的"问题"是,文件系统不是在与SQL语句相同的事务中进行事务处理的,因此,如果在删除记录时出错,文件可能仍会被删除,反之亦然。

由于我认为使用文件的应用程序应该始终明确检查文件是否存在,因此最好先清理文件。如果你先删除文件,检查它是否被删除,然后删除记录,你可以确保文件总是被删除的。如果在删除记录时发生错误,您可以随时再次查询该记录以重试。如果您先删除记录,您可能会得到一个意外未删除的文件树,从而不必要地占用磁盘空间。