【发布时间】:2012-05-22 20:01:10
【问题描述】:
我有一个产品表,其中有一个 quantity_on_hand 列,在插入/更新/删除事务时需要更新该列。在插入表中,我通过事务中的 qty 减少了字段,并且在更新中,我根据事务中的 NEW 和 OLD 值减少并添加了字段。在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 更改为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)上给出删除命令时,DELETE 触发器执行得非常好。但是,如果我们要删除一个表上的行,该表对此stockout 表有级联删除,则级联删除正在工作,但stockout 上的删除触发器没有被执行。例如。表salesinv_det_items 的主键为stockout 中的外键,关系是级联的。每当我们删除salesinv_det_items 中的一行时,stockout 中相应的外键行都会被删除,但不会执行stockout 的删除触发器。
【问题讨论】:
-
Variable_name Value innodb_version 1.1.8 protocol_version 10 slave_type_conversions version 5.5.22-cll version_comment MySQL Community Server (GPL) version_compile_machine x86_64 version_compile_os Linux
-
"目前,级联外键操作不激活触发器。"这个错误正在杀死我的数据库。 Thay 在手册中添加了信息,但没有做任何修复。
-
@ficiek 这里也一样!我不知道是什么原因导致他们无法提供世界其他地方所拥有的最低限度的触发器和外键!他们将自己与 MS SQL、Sybase、DB2 等进行比较。现在已经好几年了,仍然没有修复!再过几年,这将是与该错误一起生活的十年!行业应该突出这些漏洞,以便他们在业务上造成一些金钱损失,迫使他们投入资源来解决这个错误。否则,我认为他们这么多年没有修好它,过得很好。真是太可惜了!
标签: mysql triggers sql-update calculated-columns cascading-deletes