繁体   English   中英

MySQL删除触发器不更新其他表列

[英]MySQL delete trigger not updating other table column

我有一个products表,该表的quantity_on_hand列在插入/更新/删除事务时需要更新。 在插入表中,我已按事务中的数量减少了该字段,而在更新中,我已根据事务中的NEWOLD值进行了减少和添加。 DELETE触发器中,我只是基于OLD交易值添加了库存。

INSERTUPDATE触发器工作正常,但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=12stockoutdelete 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM