我有一个产品表,其中有一quantity_on_hand
列在插入/更新/删除事务时需要更新。在插入表中,我通过事务中的 qty 减少了字段,在更新中,我根据事务中的NEW
andOLD
值减少并添加了字段。在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
to改变,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
不会执行删除触发器。