mysql дважды запускает два обновления вместе - PullRequest
1 голос
/ 08 марта 2019

После попытки создать новый триггер в таблице 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`)

1 Ответ

0 голосов
/ 09 марта 2019

Вы не можете создать второй триггер, который "запускает" то же действие, что и другой триггер. Вместо этого вы должны использовать оператор 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;

Обратите внимание , что я ни в коем случае не являюсь экспертом в этой теме, и я только показываю вам, как бы я подошел к этой ситуации. Кроме того, я не тестировал ни один из этого кода, поэтому вам может потребоваться слегка его изменить. Если у вас есть какие-либо проблемы, дайте мне знать, и я могу обновить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...