我有一个产品表,其中quantity_on_hand
列需要在插入/更新/删除事务时更新。在插入表中,我已将字段减少了事务中的数量,并且在更新中,我已根据事务中的NEW
和OLD
值进行缩减和添加。在DELETE
触发器中,我只是根据OLD
交易值添加了股票。
INSERT
和UPDATE
触发器工作正常,但DELETE
触发器既未正确更新也未生成任何错误!这是代码:
INSERT TRIGGER(工作)
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;
$$
UPDATE TRIGGER(工作)
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 from stockout where id_stockout=12
上发出删除命令时,DELETE触发器执行完全正常。但是,如果我们删除在此stockout
表上具有级联删除的表上的行,则级联删除正在运行,但stockout
上的删除触发器未被执行。例如。 table salesinv_det_items
在stockout
中将主键作为外键,并且关系是级联的。每当我们删除salesinv_det_items
中的行时,stockout
中的相应外键行都会被删除,但stockout
的删除触发器不会被执行。
答案 0 :(得分:1)
<强>答案:强> 自5.0发布以来,MySQL有一个错误,并且尚未解决到此日期不会触发外键级联操作的触发器。 http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html
它说: 目前,级联外键操作不会激活触发器。
看起来很神奇,但确实如此!
然后答案是不要使用级联的外键,而是编写触发器来代替它。