【问题标题】:MySQL select statement result in after delete trigger always nullMySQL select语句导致删除触发器后始终为空
【发布时间】:2017-07-20 03:39:47
【问题描述】:

我在使用 MySQL 数据库中的触发器时遇到了一点问题。我有一个带有两个表的数据库:“任务”和“文件”。 “任务”表有一个字段,它是“文件”表中主键的外键。它有时也可能为空。

我要完成的是首先删除“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。触发此触发器的删除语句运行良好,但“文件”表中的行永远不会被删除。我试图在测试表上插入“fieldId”变量,它总是保存一个空值。

那个触发器有问题吗?也许我正在尝试做一些根本不可能的事情?

非常感谢所有帮助:)

【问题讨论】:

    标签: mysql database triggers


    【解决方案1】:

    AFTER delete 表示数据被删除了,当然找不到了。尝试为删除之前创建触发器。

    您还可以更谨慎地使用所有旧值,而不是从已删除的表中选择。

    【讨论】:

    • 我想,虽然是After delete,但我还是能找到它,因为直到after触发器完成,事务才完成。我不能使用 Before 触发器,因为我不能在删除“tasks”表之前删除“files”表上的行,它是该表的外键。而且我认为将其设置为“删除级联”是没有意义的。我想我已经找到了访问 old.file 以在触发器上进行删除的解决方案。你说的第二句话就是这个意思吗?我没完全明白你的意思。
    【解决方案2】:

    既然它应该遍历每个已删除的行,为什么这不起作用?

    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 ;
    

    但我认为这没有必要。

    【讨论】:

    • 嗨!是的,这是我刚刚意识到阅读更多的答案。我不敢相信我之前没有想到这一点。谢谢!
    猜你喜欢
    • 2011-02-16
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2016-02-25
    相关资源
    最近更新 更多