级联删除数据库记录以删除关联的图像文件

时间:2016-07-03 07:44:20

标签: mysql database triggers innodb cascading-deletes

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

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

我的viewModel.Places.Add(new Place { Id = 3, City = "Miami", Country = "USA" }); 表就是您所期望的,它有一个products主列。 我的id表的product_images列包含product_id列的外键,以及存储图像文件名的varchar类型的products.id列。

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

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

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

3 个答案:

答案 0 :(得分:2)

mysql没有内置的本机功能来执行此操作。如果有的话,将它变成功能蠕变和完整的高级编程语言将毫无止境。膨胀,远离其核心竞争力。

人们使用在C中编译的UDF库,它们作为目标文件集成到mysql中或者编译到服务器源中。请参阅Adding New Functions to MySQLUDF Repository for MySQL部分。它变得像一个科学公平的项目,在你让它上班一次之后,你可能不会想把它推出到其他服务器上。

那你有什么选择呢?安全的赌注总是写入另一个表(在级联删除层次结构之外)目录/文件名组合。还有另一个迷你系统为你做清理工作。例如,每天两次,使用Java或c#或python(任何语言)。这些环境具有db库和强大的文件操作。无论如何,这将是非常容易的。

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

将图像插入数据库时​​,更改其名称以与其产品链接 或者它的类别。 当删除具有涉及cat id的名称的imaged的类别搜索时,取消链接

此代码可以提供帮助

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


    }