MYSQL错误1442:无法更新触发器/存储过程中的表

时间:2016-09-12 07:16:37

标签: mysql stored-procedures triggers

考虑表TRADE_ORDERS

Symbol | Type | Count | Settled | Settled_count
------ | -----| ------| --------| -------------
Apple  | BUY  | 100   | NO      |  0
Apple  | BUY  | 50    | NO      |  0

我已经写了一个触发器after_trade_orders_insert,新行的AFTER INSERT会尝试解决以前的订单,具体取决于是否有未结算的订单。

现在,如果我INSERT进入TRADE_ORDERS值为Apple, SELL, 150的行,则应该结算所有已购买的股票。因此,预期的行动应该使表格处于以下状态。

预期输出

Symbol | Type | Count | Settled | Settled_count
------ | -----| ------| --------| -------------
Apple  | BUY  | 100   | YES     |  100
Apple  | BUY  | 50    | YES     |  50
Apple  | SELL | 150   | YES     |  150

我理解如何在mysql中编写代码来实现。但是当我在after_trade_orders_insert中编写代码时,它会失败并显示错误

  

错误代码:1442。无法更新存储函数/触发器中的表'NSE_FO',因为它已被调用此存储函数/触发器的语句使用。 0.055秒

我理解这个错误是什么以及它为什么会发生。

问题:如何实现预期输出?

2 个答案:

答案 0 :(得分:0)

您无法通过触发器更新表格中最近插入的行,因此您必须将where子句与 new 关键字一起使用。

答案 1 :(得分:0)

我们无法做我们想做的事情 - 触发器/存储过程无法更新与该行相同的表的另一行,从中调用触发器。

如何实现呢? 来自此thread

的接受答案
  

这样做的典型方法是创建一个存储过程   插入/更新目标表,然后更新其他行,   所有在交易中。