gpt4 book ai didi

mysql - 无法弄清楚我的触发逻辑有问题吗?

转载 作者:行者123 更新时间:2023-11-29 09:24:14 25 4
gpt4 key购买 nike

我有两个表,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 个发票InPorgress。

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

最佳答案

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 ;

关于mysql - 无法弄清楚我的触发逻辑有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59881008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com