mysql同时触发两个更新

mysql同时触发两个更新,mysql,triggers,Mysql,Triggers,尝试在发票表中创建一个新触发器后,更新`invoices`设置发票。`owes`=(`owes`-`paid`) 我得到一个错误,因为我已经在payments中找到另一个正在更新的触发器。(见下文) 我希望在下面保留现有触发器,但如何修改它以同时将发票表中的欠欠欠欠欠(欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠 CREATE TRIGGER `after_payment_update`

尝试在
发票
表中创建一个新触发器后,
更新`invoices`设置发票。`owes`=(`owes`-`paid`)

我得到一个错误,因为我已经在
payments
中找到另一个正在更新的触发器。(见下文)

我希望在下面保留现有触发器,但如何修改它以同时将
发票
表中的
欠欠欠欠欠(
欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠欠

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 $$
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 $$
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 ;
作为一般规则,如果需要执行多个需要
的语句
在它们的末尾,需要使用
分隔符
。如果这仍然没有意义,可以找到一个很好的分隔符解释

另一方面,我不认为这种方法是最理想的。在您的情况下,我要做的是创建一个组合这些表的视图。例如:

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
)
然后要访问
已付金额
欠款金额
列,只需查询以下内容:

SELECT invoice, amount_paid, amount_owed FROM invoice_payments_view 
WHERE invoice=1;
请注意我绝不是这方面的专家,我只是向您展示我将如何处理这种情况。另外,我没有测试任何代码,所以您可能需要稍微修改它。如果您有任何问题,请告诉我,我可以更新。

您不能创建第二个触发器,该触发器与另一个触发器在同一操作上“触发”。相反,您可以使用下面这样的
分隔符$$
语句,并用希望执行的所有相关代码填充触发器

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 $$
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 ;
作为一般规则,如果需要执行多个需要
的语句
在它们的末尾,需要使用
分隔符
。如果这仍然没有意义,可以找到一个很好的分隔符解释

另一方面,我不认为这种方法是最理想的。在您的情况下,我要做的是创建一个组合这些表的视图。例如:

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
)
然后要访问
已付金额
欠款金额
列,只需查询以下内容:

SELECT invoice, amount_paid, amount_owed FROM invoice_payments_view 
WHERE invoice=1;
请注意我绝不是这方面的专家,我只是向您展示我将如何处理这种情况。另外,我没有测试任何代码,所以您可能需要稍微修改它。如果你有任何问题,让我知道,我可以更新