1

我有一个产品表,其中有一quantity_on_hand列在插入/更新/删除事务时需要更新。在插入表中,我通过事务中的 qty 减少了字段,在更新中,我根据事务中的NEWandOLD值减少并添加了字段。在DELETE触发器中,我只是根据OLD交易价值添加了股票。

和触发器工作正常INSERTUPDATEDELETE触发器既没有正确更新也没有产生任何错误!这是代码:

插入触发器(工作)

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 没有报告任何错误代码!我试过从AFTERto改变,BEFORE但问题是一样的。删除一行后,in 的值qoh保持不变!

这个问题仍然存在。我在运行 MySQL 5.5 的基于 cPanel 的环境中的其他 MySQL 数据库服务器上对其进行了测试。我的开发服务器和此生产服务器上的环境或多或少相同,问题也相同。变量名值 innodb_version 1.1.8 version 5.5.22-cll version_comment MySQL Community Server (GPL)

更新:当直接在表上给出删除命令时,DELETE 触发器执行得非常好stockout,即delete from stockout where id_stockout=12. 但是,如果我们要删除该表上具有级联删除的表上的行,stockout则级联删除正在工作,但删除触发器stockout未执行。例如,表salesinv_det_items有它的主键作为外键,stockout并且关系是级联的。每当我们删除salesinv_det_items对应的外键行中的一行时,都会stockout删除其中的删除触发器,但stockout不会执行删除触发器。

4

1 回答 1

2

OP写道:

回答: MySQL 自 5.0 版以来存在一个错误,该错误到目前为止尚未解决,它不会触发外键级联操作的触发器。 http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

它说: 目前,级联外键操作不激活触发器。

看起来很神奇,但这是真的!

那么答案不是让外键级联,而是编写触发器来完成这项工作。

于 2015-08-21T22:46:27.037 回答