0

我有一个产品表有quantity_on_hand列,当插入/更新/删除事务时需要更新该列。在插入表中,我减少了交易中的数量字段,并且在更新中,我已经按照事务中的NEWOLD值进行了减少和添加。在DELETE触发器中,我简单地根据交易值OLD添加了股票。MySQL删除触发器不更新其他表列

INSERTUPDATE触发器工作正常,但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的删除触发器。

+0

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

+0

“目前,级联外键操作不会激活触发器。“这个错误正在杀死我的数据库。 Thay在手册中添加了信息,并没有做任何修改。 – boreq

+1

@ficiek同样在这里!我不知道是什么促使他们提供触发器和外键,因为他们无法提供世界其他地方的最低限度!他们将自己与MS SQL,Sybase,DB2等进行比较。现在已经过去几年了,现在还没有解决!再过几年,这将是与这个错误共同生活的十年!业界应该强调这些漏洞,以便在商业上造成一些经济损失,迫使他们投资资源来解决这个问题。否则,我认为他们现在生活得很好,没有固定这么多年。真是太遗憾了! – somnath

回答

1

的OP写道:

答: MySQL有自5.0版本中的错误,并且尚未解决,在此日期不从外键级联操作触发的触发。 http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

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

令人惊讶,因为它可能看起来,但它是真实的!

答案不是有级联的外键,而是写触发器来完成这项工作。

+0

([在问题中回答编辑并转换为社区wiki](http://meta.stackoverflow.com/questions/267434/what-is-the-woole-action-when-the-answer-to-a-问题 - 被添加到所述阙))。 –