簡體   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