删除触发器后的MySQL select语句结果始终为null

时间:2017-03-01 00:20:00

标签: mysql database triggers

我对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”变量,它总是保存一个空值。

该触发器有问题吗?也许我想做一些根本不可能的事情?

非常感谢所有帮助:)

2 个答案:

答案 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 ;

但我不认为这是必要的。