【问题标题】:Cascade deletion of database record to deletion of associated image file级联删除数据库记录到删除关联图像文件
【发布时间】:2016-11-05 04:28:26
【问题描述】:

我最近发现了 InnoDB 的外键和删除级联的奇迹,我喜欢它。它可以帮助我轻松删除复杂的数据结构,而不必担心留下垃圾。

我目前正在以下列方式存储产品数据库的图像(就像您在网上商店中一样):

我的products 表是您所期望的,它有一个id 主列。 我的product_images 表有一个product_id 列,其中有一个指向products.id 列的外键,以及一个存储图像文件名的varchar 类型的image 列。

文件名是通过计算图像的 SHA1 哈希值创建的,然后存储在以哈希值的前 2 个字符命名的文件夹中: 61/6153A6FA0E4880D9B8D0BE4720F78E895265D0A9.jpg。数据库中只存储了6153A6FA0E4880D9B8D0BE4720F78E895265D0A9.jpg

现在,如果我要从数据库中删除产品,级联 DELETE 规则将删除 product_images 表中的记录,但会将文件保留在我的服务器上。

有没有办法在product_images 表中的记录被删除时自动删除图像文件,无论是具体还是通过级联?也许将某种触发器或例程链接到删除操作?

【问题讨论】:

  • 我认为 MySQL 中不存在这样的功能,但很想听听解决这个问题的方法
  • 这也是我不使用CASCADE(或FOREIGN KEYs,就此而言)的另一个原因,而是在应用程序中完成所有工作。

标签: mysql database triggers innodb cascading-deletes


【解决方案1】:

mysql 中没有内置的本机功能来执行此操作。如果有的话,将它变成功能蠕变和成熟的高级编程语言就没有尽头了。膨胀软件,远离其核心竞争力。

人们使用了用 C 编译的 UDF 库,这些库可以作为目标文件集成到 mysql 中,也可以编译到服务器源代码中。请参阅 Adding New Functions to MySQLUDF Repository for MySQL 部分。它变得像一个科学展览项目,在你让它工作一次之后,你可能不想将它推广到其他服务器群。

那么你有什么选择?安全的赌注总是将目录/文件名组合写入另一个表(在您的级联删除层次结构之外)。并让另一个迷你系统为您打扫房间。例如,一天两次,使用 Java、c# 或 python(任何语言)。这些环境具有数据库库和强大的文件操作。无论如何,这样会容易得多。

我做这些事情是为了扩展与 mysql 相关的活动的功能,这些活动主要是基于文件的或在存储过程和 events 内禁止调用。

【讨论】:

  • 感谢您的深入回答。我希望会有某种类似于 TRIGGER 的东西,可以让我执行脚本或与文件系统交互。太糟糕了 :) 正如你所说,我想我可以创建一个触发器,将删除记录在一个单独的表中,然后定期轮询该表以了解我应该删除哪些文件。
  • UDF 的使用是粗略的。那我如何轻松部署。我相信你的代码位于别处,你会发现更多的力量和快乐。抱歉,这不是您(目前)所希望的。
  • 查看cron,它在运行任务时非常受欢迎,无论您通过crontab 放入适当的字符串和时间表。
【解决方案2】:

您将使用以下代码删除特定文件。
注意:您的文件名 ($filName) 将来自您的查询。

$filName;
$dirName = substr($filName, 0, 2);

chown($filName,465);
unlink("../".dirName."/" . $filName);

【讨论】:

  • 我认为你没有理解我的要求。我知道如何删除服务器上的文件,但我想知道如果从我的表中删除了一行(因此使用了级联一词),如何自动执行此删除操作。我想以某种方式将脚本链接到 mysql 删除操作。
【解决方案3】:

将图像插入数据库时​​,将其名称更改为与其产品相关联 或者它的类别。 删除类别搜索名称涉及猫 id 的图像时,请取消链接

这段代码可以提供帮助

        foreach(glob(IMG_PATH.'cat_'.$_POST['id'].'*.*') as $file)
        {
            if(is_file($file))
            {
                @unlink($file);
            }


    }

【讨论】:

    猜你喜欢
    • 2014-01-13
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    相关资源
    最近更新 更多