尝试在 invoices
表中创建新触发器以UPDATE `invoices` SET invoices.`owes` = (`owes` - `paid`);
我得到一个错误,因为我已经在 payments
中更新了另一个触发器。 (见下文)
我希望将现有触发器保留在下方,但如何修改它以将 owes
也更新为 (owes
- paid
)在 invoices
表中。
CREATE TRIGGER `after_payment_update` AFTER UPDATE
ON `payments`
FOR EACH ROW UPDATE `invoices`
SET invoices.`paid` = (SELECT SUM(payments .`payment`)
FROM payments WHERE payments.`invoice` = invoices.`invoice`)
最佳答案
您不能创建第二个触发器来“触发”与另一个触发器相同的操作。相反,您可以使用如下所示的 DELIMITER $$
语句,并用您要执行的所有相关代码填充您的触发器。
DELIMITER $$
CREATE TRIGGER after_update_payments
AFTER UPDATE ON payments
FOR EACH ROW BEGIN
UPDATE invoices
SET NEW.paid = (SELECT SUM(payment) FROM payments WHERE invoice = NEW.invoice),
NEW.owes = (owes -(SELECT SUM(payment) FROM payments WHERE invoice = NEW.invoice));
END $$
DELIMITER ;
在上面的触发器中你实际上不需要 DELIMITER
,所以我将向你展示一个你需要使用它的例子:
DELIMITER $$
CREATE TRIGGER after_update_payments
AFTER UPDATE ON payments
FOR EACH ROW BEGIN
IF (some condition here) THEN
UPDATE invoices
SET NEW.paid = (SELECT SUM(payment) FROM payments WHERE invoice = NEW.invoice),
NEW.owes = (owes -(SELECT SUM(payment) FROM payments WHERE invoice = NEW.invoice));
END IF;
END $$
DELIMITER ;
作为一般规则,如果您需要执行多个需要 ;
结尾的语句,则需要使用 DELIMITER
。如果这仍然没有意义,可以找到对定界符的很好解释 here .
现在,顺便提一下,我不认为这种方法是最最佳的方法。在你的情况下我会做的是创建一个组合这些表的 View 。例如:
CREATE
ALGORITHM = UNDEFINED
DEFINER = `root`@`localhost`
SQL SECURITY DEFINER
VIEW invoice_payments_view AS (
SELECT
t1.*,
SUM(t2.payment) as amount_paid,
SUM(t2.owes - SUM(t2.payment)) as amount_owed
FROM invoices t1
JOIN payments t2 ON (t1.invoice=t2.invoice)
GROUP BY t1.invoice
)
然后要访问 amount_paid
和 amount_owed
列,您只需查询以下内容:
SELECT invoice, amount_paid, amount_owed FROM invoice_payments_view
WHERE invoice=1;
请注意,我绝不是该主题的专家,我只是向您展示我将如何处理这种情况。另外,我没有测试任何这段代码,所以您可能需要稍微修改一下。如果您有任何问题,请告诉我,我可以更新。
关于mysql double 触发两个一起更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55068289/