MySQL删除触发器不更新其他表列

时间:2012-05-15 10:11:45

标签: mysql triggers sql-update calculated-columns cascading-deletes

我有一个产品表,其中quantity_on_hand列需要在插入/更新/删除事务时更新。在插入表中,我已将字段减少了事务中的数量,并且在更新中,我已根据事务中的NEWOLD值进行缩减和添加。在DELETE触发器中,我只是根据OLD交易值添加了股票。

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;
$$

删除未按预期工作的触发器

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数据库服务器上测试了它。我的开发服务器和此生产服务器上的环境或多或少相同,问题是相同的。 Variable_name值 innodb_version 1.1.8 版本5.5.22-cll version_comment MySQL社区服务器(GPL)

更新:当直接在stockout表格delete from stockout where id_stockout=12上发出删除命令时,DELETE触发器执行完全正常。但是,如果我们删除在此stockout表上具有级联删除的表上的行,则级联删除正在运行,但stockout上的删除触发器未被执行。例如。 table salesinv_det_itemsstockout中将主键作为外键,并且关系是级联的。每当我们删除salesinv_det_items中的行时,stockout中的相应外键行都会被删除,但stockout的删除触发器不会被执行。

1 个答案:

答案 0 :(得分:1)

OP写道:

  

<强>答案:   自5.0发布以来,MySQL有一个错误,并且尚未解决到此日期不会触发外键级联操作的触发器。   http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

     

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

     

看起来很神奇,但确实如此!

     

然后答案是不要使用级联的外键,而是编写触发器来代替它。