我最近发现外键的奇迹和删除与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
表中的记录时自动删除图像文件,无论是具体还是通过级联?也许将某种触发器或例程链接到删除操作?
答案 0 :(得分:2)
mysql没有内置的本机功能来执行此操作。如果有的话,将它变成功能蠕变和完整的高级编程语言将毫无止境。膨胀,远离其核心竞争力。
人们使用在C中编译的UDF库,它们作为目标文件集成到mysql中或者编译到服务器源中。请参阅Adding New Functions to MySQL和UDF 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);
}
}