无法确定触发逻辑的问题吗?

问题描述 投票:0回答:1

我有两个表,listsalesorderslistinvoiceslistsalesorders是父表,每个销售订单可能有许多发票,但是每个发票仅附加到一个销售订单。

在我的listsalesorers中,有一列根据正在发送的发票来跟踪正在处理多少张发票。

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

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。

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

mysql sql mysql-5.6
1个回答
1
投票
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 ;
© www.soinside.com 2019 - 2024. All rights reserved.