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

bee*_*eeb 3 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,无论是专门删除还是级联删除?也许将某种触发器或例程链接到删除操作?

Dre*_*rew 5

mysql 中没有内置的本机功能来执行此操作。如果有的话,将其转变为功能蔓延和成熟的高级编程语言将是永无止境的。臃肿的软件,远离其核心能力。

人们已经使用了用 C 语言编译的 UDF 库,这些库可以作为目标文件集成到 mysql 中,也可以编译到服务器源代码中。请参阅向 MySQL 添加新功能MySQL 的 UDF 存储库部分。它变得像一个科学博览会项目,在你让它工作一次之后,你可能不想将它推广到其他服务器群。

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

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