【发布时间】: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
);
当该表中的一行被删除时,它所引用的文件也应该被删除。从该表中删除记录有两种情况:
- 用户删除了一张特定的照片。
- 用户删除一个特定的属性对象(如“房地产”),所有引用该属性的照片都会被
ON DELETE CASCADE自动删除。
我知道我可以在删除属性之前选择数据库中所有引用的照片,然后将它们连同文件一起删除,但我正在寻找替代解决方案。是否有可能捕捉到photo 表中的记录被删除并自动删除文件的时刻,而不用退出CASCADE 子句,也许在某种触发器中?
【问题讨论】:
-
触发器可以在
delete的时刻对数据库执行操作。但是对于数据库之外的文件删除,您必须自己执行此操作。 -
我认为这是不可能的。提出了同样的问题here
-
可能通过一个名为 sys_exec 的用户定义函数,但我不推荐它。您应该通过使您的应用程序运行的语言来控制这种行为,数据库应该只处理其数据,而不是文件。
-
@Septagram:我们可以从 mysql 中删除/创建文件吗?我不是在挑战你,但真的很想知道。但是,您当然可以在服务器端代码中使用您正在使用的编程语言中删除文件。
-
@NB,你可能是对的。虽然 DocJones 回答了一般问题,但在这种特殊情况下,删除数据库之外的文件会更干净。我将用
ON DELETE SET NULL替换ON DELETE CASCADE并在删除property后,选择所有悬空的photo记录并将它们全部删除,以确保没有悬空文件留下。谢谢大家:)
标签: mysql