无法找出我的触发逻辑的问题?

Can't figure out issue with my trigger logic?

我有两个 table,listsalesorderslistinvoiceslistsalesorders是父table,每个销售订单可能有很多发票,但每个发票只附在一个销售订单上。

在我的 listsalesorers 中,我有一列跟踪正在处理的发票数量,这是基于发票是否已发出。

listinvoices table 的更新后触发器中,我想更新父销售订单行。现在我有这个

DELIMITER //
CREATE TRIGGER listinvoices_AUPD AFTER UPDATE ON listinvoices
FOR EACH ROW
BEGIN
UPDATE listsalesorders as so
SET so.invoicesInProgress = (SELECT COUNT(i.idx) FROM listinvoices i WHERE new.parentSOId = so.idx AND (i.sentToContact = 1 or i.sentToAccounting=1))
WHERE so.idx = new.parentSOId;
END//
DELIMITER ;

之前有一个存储过程可以更新每个销售订单,即使只更新了一张发票,这意味着仅更新一张发票需要 30 秒。这是我尝试只更新确切的父销售订单。然而,当我对速度和 运行 影响所有发票 ID 的 %5 = 0 的东西进行测试时,我发现了一些奇怪的东西,几乎所有受影响的销售订单都计算了 382 invoicesInPorgress。

我做错了什么?在触发器上只更新子行的父行的正确方法是什么?我知道您可能想说只使用一个视图,但是我们的客户端应用程序中的许多地方已经引用了此列,更改所有这些查询并不是一个简单的修复,我只修复会容易得多列的计算方式。

COUNT 的子查询条件似乎有误,试试这个:

DELIMITER //
CREATE TRIGGER listinvoices_AUPD AFTER UPDATE ON listinvoices
FOR EACH ROW
BEGIN
UPDATE listsalesorders as so
SET so.invoicesInProgress = (SELECT COUNT(i.idx) FROM listinvoices i WHERE i.parentSOId=new.parentSOId AND (i.sentToContact = 1 or i.sentToAccounting=1))
WHERE so.idx = new.parentSOId;
END//
DELIMITER ;