【问题标题】:How to delete files when a record is deleted?删除记录时如何删除文件?
【发布时间】:2012-09-26 11:36:32
【问题描述】:

我有一张桌子:

CREATE TABLE photo (
    photo_id BIGINT NOT NULL AUTO_INCREMENT,
    property_id BIGINT NOT NULL,
    filename VARCHAR (50) NOT NULL;
    ...
    PRIMARY KEY (photo_id),
    CONSTRAINT photo_fk_property FOREIGN KEY (property_id)
        REFERENCES property (property_id)
        ON DELETE CASCADE
);

当该表中的一行被删除时,它所引用的文件也应该被删除。从该表中删除记录有两种情况:

  1. 用户删除了一张特定的照片。
  2. 用户删除一个特定的属性对象(如“房地产”),所有引用该属性的照片都会被ON DELETE CASCADE自动删除。

我知道我可以在删除属性之前选择数据库中所有引用的照片,然后将它们连同文件一起删除,但我正在寻找替代解决方案。是否有可能捕捉到photo 表中的记录被删除并自动删除文件的时刻,而不用退出CASCADE 子句,也许在某种触发器中?

【问题讨论】:

  • 触发器可以在delete 的时刻对数据库执行操作。但是对于数据库之外的文件删除,您必须自己执行此操作。
  • 我认为这是不可能的。提出了同样的问题here
  • 可能通过一个名为 sys_exec 的用户定义函数,但我不推荐它。您应该通过使您的应用程序运行的语言来控制这种行为,数据库应该只处理其数据,而不是文件。
  • @Septagram:我们可以从 mysql 中删除/创建文件吗?我不是在挑战你,但真的很想知道。但是,您当然可以在服务器端代码中使用您正在使用的编程语言中删除文件。
  • @NB,你可能是对的。虽然 DocJones 回答了一般问题,但在这种特殊情况下,删除数据库之外的文件会更干净。我将用ON DELETE SET NULL 替换ON DELETE CASCADE 并在删除property 后,选择所有悬空的photo 记录并将它们全部删除,以确保没有悬空文件留下。谢谢大家:)

标签: mysql


【解决方案1】:

您正在寻找DELETE TRIGGER。有关类似的问题和解决方案,请参阅here。外部动作可以通过安装sys_exec来实现。

CREATE TRIGGER foobar
AFTER DELETE ON photo
FOR EACH ROW
BEGIN
   CALL sys_exec(concat('/bin/rm -f ',filename));
END

【讨论】:

  • 如果删除是一个事务,会发生什么?如果必须回滚,我无法取消删除文件。如果文件删除有问题,交易会失败吗? - 说权限问题。
  • 链接对 sys_exec 无效
  • 链接 github repo 与 sys_exec-link
猜你喜欢
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多