我对MySQL数据库中的触发器有一点问题。我有一个带有两个表的数据库:“任务”和“文件”。 “tasks”表有一个字段,它是“files”表中主键的外键。它有时也可能为空。
我想要实现的是首先删除“tasks”表中的一行,然后使用触发器删除“files”表中的相应行。
这是我现在正在使用的触发器:
DELIMITER //
CREATE TRIGGER after_delete_file AFTER DELETE ON tasks
FOR EACH ROW
BEGIN
DECLARE fileId int;
SELECT file INTO fileId FROM tasks WHERE id=old.id;
DELETE FROM files WHERE id=fileId;
END;//
DELIMITER ;
“任务”表中的字段“文件”是包含外键的字段。在我一直在运行的示例中,该字段从未为空。
问题是select语句总是返回null。触发此触发器的delete语句正常,但“files”表中的行永远不会被删除。我试图在测试表上插入“fieldId”变量,它总是保存一个空值。
该触发器有问题吗?也许我想做一些根本不可能的事情?
非常感谢所有帮助:)
答案 0 :(得分:1)
删除后意味着数据被删除,当然您无法找到它。尝试为BEFORE删除创建触发器。
您还可以更仔细地使用所有旧值,而不是从已删除的表中进行选择。
答案 1 :(得分:1)
因为它应该循环遍历每个已删除的行,为什么这不起作用?
DELIMITER //
CREATE TRIGGER after_delete_file AFTER DELETE ON tasks
FOR EACH ROW
BEGIN
DELETE FROM files WHERE id=old.file;
END;//
DELIMITER ;
如果这不起作用,可以试试这个:
DELIMITER //
CREATE TRIGGER after_delete_file AFTER DELETE ON tasks
FOR EACH ROW
BEGIN
DELETE FROM files INNER JOIN tasks ON files.id=tasks.file WHERE tasks.id=old.id;
END;//
DELIMITER ;
但我不认为这是必要的。