0

我在调用更新、插入、删除的触发器中使用以下代码。问题是当触发器运行时,它会将发票表中的所有余额总计更新为相同.....它应该根据对应的发票行 sum() 更新每个发票总计,而不是将它们更新为全部相同。我已经坚持了几个小时,只是无法理解它。

UPDATE invoices
SET invoices.Amount = (SELECT
SUM(invoicelines.Amount) AS expr1
FROM invoicelines i
INNER JOIN invoicelines
ON i.Id = i.Id
WHERE i.InvoiceId = i.InvoiceId
GROUP BY i.InvoiceId) 
WHERE Id = Id;
4

1 回答 1

2

您应该有外部 WHERE 子句:

WHERE id = NEW.id;

否则,您将更新表中的每条记录,因为每条记录都将返回 true,即它们的 ID 等于它们的 ID。

此外,如果您想将发票行金额删除或添加到发票金额中,则工作量太大。

你可以这样做:

对于插入

UPDATE invoices
    SET Amount = Amount + NEW.amount
WHERE id = NEW.InvoiceId;

对于更新:

UPDATE invoices
    SET Amount = Amount + NEW.amount - OLD.amount
WHERE id = NEW.InvoiceId;

对于删除:

UPDATE invoices
    SET Amount = Amount - OLD.amount
WHERE id = OLD.InvoiceId;
于 2013-10-24T20:58:13.553 回答