mysql double 触发两个一起更新

标签 mysql triggers

尝试在 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_paidamount_owed 列,您只需查询以下内容:

SELECT invoice, amount_paid, amount_owed FROM invoice_payments_view 
WHERE invoice=1;

请注意,我绝不是该主题的专家,我只是向您展示我将如何处理这种情况。另外,我没有测试任何这段代码,所以您可能需要稍微修改一下。如果您有任何问题,请告诉我,我可以更新。

关于mysql double 触发两个一起更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55068289/

相关文章:

php - 使用 PHP 将网页连接到数据库会产生奇怪的结果

java - 该行是否存在?如果是更新它,如果不是添加它 mysql/java

php - MYSQL 即使使用 DISTINCT 也加入重复结果

typescript - 使用vscode api补全功能时如何删除触发字符?

mysql - 数据库触发器选择多行并插入到表中

mysql 联合两个查询与顺序

php - 如何在 PHP 中使用 PDO 从数据库获取参数

MySQL-更新插入的自动增量主键到自定义值

mysql - 如果mysql中某列是某个值,如何禁止更新表?

c# - WPF 事件触发器