[英]MySQL delete trigger not updating other table column
我有一个products表,该表的quantity_on_hand
列在插入/更新/删除事务时需要更新。 在插入表中,我已按事务中的数量减少了该字段,而在更新中,我已根据事务中的NEW
和OLD
值进行了减少和添加。 在DELETE
触发器中,我只是基于OLD
交易值添加了库存。
INSERT
和UPDATE
触发器工作正常,但DELETE
触发器既未正确更新,也未生成任何错误! 这是代码:
插入触发器(工作中)
CREATE TRIGGER `tr_stockout_ai` AFTER INSERT ON `stockout`
FOR EACH ROW BEGIN
UPDATE stockin SET qoh = qoh - NEW.qty WHERE id_stockin = NEW.id_stockin;
END;
$$
更新触发(工作中)
CREATE TRIGGER `tr_stockout_au` AFTER UPDATE ON `stockout`
FOR EACH ROW BEGIN
UPDATE stockin SET qoh = qoh + OLD.qty WHERE id_stockin = OLD.id_stockin;
UPDATE stockin SET qoh = qoh - NEW.qty WHERE id_stockin = NEW.id_stockin;
END;
$$
删除触发操作不正确
CREATE TRIGGER `tr_stockout_ad` AFTER DELETE ON `stockout`
FOR EACH ROW BEGIN
UPDATE stockin SET qoh = qoh + OLD.qty WHERE id_stockin = OLD.id_stockin;
END;
$$
有人可以告诉我我在这里想念的吗? 请注意,没有语法错误,代码可以很好地创建触发器,并且在执行触发器并且MySQL没有报告任何错误代码时也没有显示错误! 我尝试从AFTER
更改为BEFORE
但问题仍然相同。 删除一行后, qoh
的值保持不变!
这个问题仍然存在。 我在运行MySQL 5.5的基于cPanel的环境中的其他MySQL数据库服务器上进行了测试。 我的开发服务器和此生产服务器上的环境大致相同,并且问题相同。 Variable_name值innodb_version 1.1.8版本5.5.22-cll version_comment MySQL社区服务器(GPL)
更新:当直接在stockout
表上给出delete命令时(即delete from stockout where id_stockout=12
的stockout
中delete from stockout where id_stockout=12
DELETE触发器执行得很好 。 但是,如果我们要删除该stockout
表上具有级联删除功能的表上的行,则级联删除有效,但没有执行stockout
的删除触发器。 例如,表salesinv_det_items
具有主键作为stockout
外键,并且该关系是级联的。 每当我们在删除一行salesinv_det_items
在相应的外键行stockout
被删除,但在删除触发器stockout
不执行。
OP写道:
答: MySQL自5.0发行以来存在一个错误,到现在为止该错误尚未解决,该错误不会从外键级联操作触发触发器。 http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html
它说: 当前,级联的外键动作不会激活触发器。
看起来很神奇,但这是真的!
答案是不要让外键级联,而要编写触发器来代替它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.