gpt4 book ai didi

MySQL 更新触发器准备好的语句解决方法?

转载 作者:行者123 更新时间:2023-11-30 01:27:07 25 4
gpt4 key购买 nike

我正在为发票开发一个自定义触发器,它捕获更新的每一行的 Invoice.ID 上的 ID。 Invoice.ID将用于查询Orders.ID并选择Orders.Quantity和Orders.SKU。然后,我为 Bundles 中的每个 Product.ID 扣除 Product.Quantity(即 Bundle one 由 Product1、product2 和 Product3 组成)

我的更新触发器运行正常,但问题在于运行 MySQL 准备语句的应用程序,该语句似乎使用相同的信息多次更新表(该程序不是开源的,我无法更改 mysql 调用)。显然,发生的情况是我的发票触发器每次都会运行,并抛出我的计算来扣除捆绑产品中包含的每个产品的 Product.Quantity 。在下面的示例中,如果发票针对 Box 2,则产品 523 的数量应扣除 25。由于准备好的 mysql 语句,触发器运行两次,并扣除 50 个库存。另请参阅下面的 mysql.general.log。

AFTER UPDATE ON `myDB`.`Invoice`
FOR EACH ROW
BEGIN

DECLARE invoice_id integer;
DECLARE order_status varchar(11);
DECLARE order_sku varchar(255);
DECLARE order_quantity integer;

SET invoice_id = (SELECT InvoiceID FROM Invoice WHERE InvoiceID = NEW.InvoiceID);
SELECT Status INTO order_status FROM Invoice WHERE InvoiceID = invoice_id;
SELECT SKU INTO order_sku FROM Orders WHERE InvoiceID = invoice_id AND SKU LIKE '%Box%';
SELECT Quantity INTO order_quantity FROM Orders WHERE InvoiceID = invoice_id AND SKU LIKE '%Box%';

IF order_status = 'Ordered' THEN
IF order_sku = 'Box 1' THEN
UPDATE Product
SET Quantity = CASE ProductNo
WHEN 525 THEN (Quantity + (-3 * order_quantity))
WHEN 523 THEN (Quantity + (-2 * order_quantity))
WHEN 526 THEN (Quantity + (-1 * order_quantity))
WHEN 524 THEN (Quantity + (-1 * order_quantity))
WHEN 502 THEN (Quantity + (-2 * order_quantity))
WHEN 515 THEN (Quantity + (-1 * order_quantity))
WHEN 506 THEN (Quantity + (-2 * order_quantity))
WHEN 520 THEN (Quantity + (-1 * order_quantity))
WHEN 514 THEN (Quantity + (-1 * order_quantity))
WHEN 532 THEN (Quantity + (-1 * order_quantity))
WHEN 527 THEN (Quantity + (-1 * order_quantity))
WHEN 497 THEN (Quantity + (-1 * order_quantity))
END
WHERE ProductNo IN (525, 523, 526, 524, 502, 515, 506, 520, 514, 532, 527, 497);
END IF;

IF order_sku = 'Box 2' THEN
UPDATE Product
SET Quantity = Quantity + (-25 * order_quantity)
WHERE ProductNo = 523;
END IF;

Mysql.General.Log

 47 Prepare     [12526] UPDATE Invoice SET InvoiceNo = ?, Status = ?...
47 Execute [12526] UPDATE Invoice SET InvoiceNo = 208048, Status = Ordered ....

这是理性的思考吗?因为程序在更新发票之前使用了上述“准备好的语句”,所以在触发器上执行了 2 次迭代,导致我对库存的扣除出现偏差?

任何见解/帮助将不胜感激。

最佳答案

对于任何寻找类似解决方案的人来说,它非常简单并且一直在我面前。

IF NEW.Status <> OLD.Status THEN
-- DO SOMETHING IMPORTANT!
END IF;

关于MySQL 更新触发器准备好的语句解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17869170/

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