【问题标题】:Delete files & rows from a MySQL result set从 MySQL 结果集中删除文件和行
【发布时间】:2011-06-08 20:27:48
【问题描述】:

我有一个 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

【问题讨论】:

  • 嗯。我真的没有看到问题。事务确保它将选择然后删除该行,并且unlink(); 函数确实有效。你有什么问题?

标签: php mysql


【解决方案1】:

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

<?php

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


?>

【讨论】:

    【解决方案2】:

    我认为你实际上没有问题。您可以选择所有记录并对其进行迭代。执行查询后,您可以遍历结果集中的每条记录,即使您使用第二个查询将它们删除。结果集在您对其进行迭代时保存在内存中。

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-02-16
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多