Вы не можете создать второй триггер, который "запускает" то же действие, что и другой триггер. Вместо этого вы должны использовать оператор 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
. Если это все еще не имеет смысла, отличное объяснение разделителей можно найти здесь .
Теперь, на заметку, я не думаю, что этот подход - самый оптимальный. В вашей ситуации я бы создал представление, объединяющее эти таблицы. Например:
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;
Обратите внимание , что я ни в коем случае не являюсь экспертом в этой теме, и я только показываю вам, как бы я подошел к этой ситуации. Кроме того, я не тестировал ни один из этого кода, поэтому вам может потребоваться слегка его изменить. Если у вас есть какие-либо проблемы, дайте мне знать, и я могу обновить.