mysql - 级联删除数据库记录到删除相关图像文件

标签 mysql database triggers innodb cascading-deletes

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

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

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

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

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

有没有一种方法可以在 product_images 表中的记录被删除时自动删除图像文件,是特定的还是级联的?也许将某种触发器或例程链接到删除操作?

最佳答案

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

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

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

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

关于mysql - 级联删除数据库记录到删除相关图像文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38167784/

相关文章:

jenkins - <jenkins> 管道触发器中的时区

mysql - AFTER INSERT 触发器和 INSERT IGNORE/ON DUPLICATE KEY 更新

php - 当 table1 中删除行时,在 table2 中插入行

php - PDO::fetch() 限制 1

php - 特定条件下的 MySQL COUNT() 总帖子数?

sql - 如何在 PostgreSQL 中实现多对多关系?

PHP/MySql 更新不起作用

mysql - 为什么仅使用索引不能解决这个结果?

mysql - 如何从order_id获取选项图片

php - 在PHP中获取意外的文件结束错误