我有一个产品表有quantity_on_hand
列,当插入/更新/删除事务时需要更新该列。在插入表中,我减少了交易中的数量字段,并且在更新中,我已经按照事务中的NEW
和OLD
值进行了减少和添加。在DELETE
触发器中,我简单地根据交易值OLD
添加了股票。MySQL删除触发器不更新其他表列
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;
$$
DELETE TRIGGER这是不按预期
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数据库服务器上测试了它。我的开发服务器和这台生产服务器上的环境差不多,问题是一样的。 变量名值 innodb_version 1.1.8版本 5.5.22-CLL version_comment MySQL社区服务器(GPL)
更新:删除触发器被执行完全正常当被直接赋予的删除命令stockout
表即delete from stockout where id_stockout=12
。但是,如果我们在此stockout
表上删除具有级联删除的表上的一行,则级联删除正在工作,但stockout
上的删除触发未被执行。例如。表salesinv_det_items
的主键为stockout
的外键,关系是级联的。无论何时我们删除salesinv_det_items
中的一行,将删除stockout
中的对应外键行,但不会执行stockout
的删除触发器。
VARIABLE_NAME \t价值 innodb_version \t 1.1.8 PROTOCOL_VERSION slave_type_conversions \t 版本\t 5.5.22-CLL version_comment \t MySQL社区服务器(GPL) version_compile_machine \t x86_64的 version_compile_os \t的Linux – somnath
“目前,级联外键操作不会激活触发器。“这个错误正在杀死我的数据库。 Thay在手册中添加了信息,并没有做任何修改。 – boreq
@ficiek同样在这里!我不知道是什么促使他们提供触发器和外键,因为他们无法提供世界其他地方的最低限度!他们将自己与MS SQL,Sybase,DB2等进行比较。现在已经过去几年了,现在还没有解决!再过几年,这将是与这个错误共同生活的十年!业界应该强调这些漏洞,以便在商业上造成一些经济损失,迫使他们投资资源来解决这个问题。否则,我认为他们现在生活得很好,没有固定这么多年。真是太遗憾了! – somnath