繁体   English   中英

从 MySQL 结果集中删除文件和行

[英]Delete files & rows from a MySQL result set

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

我打算使用 php-cli 脚本并通过 cron 每晚运行它。

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

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

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() function 删除文件。 我只是不确定如何保留结果集,迭代删除文件,然后从表中删除结果集行......没有写入临时文本文件或其他东西的大丑陋黑客。

任何帮助,将不胜感激。 谢谢!

编辑: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 [...]");
    }


?>

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM