[英]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.