Не можете определить проблему с моей логикой триггера c? - PullRequest
0 голосов
/ 23 января 2020

У меня есть две таблицы, listsalesorders и listinvoices. listsalesorders является родительской таблицей, и каждый заказ на продажу может иметь много счетов, но каждый счет прикрепляется только к одному заказу на продажу.

В моем listsalesorers у меня есть столбец, который отслеживает, сколько счетов-фактур находится в процессе, на основе того, был ли счет отправлен.

В последующем триггер обновления таблицы listinvoices, я хочу обновить строку родительского заказа на продажу. Прямо сейчас у меня есть это

DELIMITER //
CREATE TRIGGER listinvoices_AUPD AFTER UPDATE ON listinvoices
FOR EACH ROW
BEGIN
UPDATE listsalesorders as so
SET so.invoicesInProgress = (SELECT COUNT(i.idx) FROM listinvoices i WHERE new.parentSOId = so.idx AND (i.sentToContact = 1 or i.sentToAccounting=1))
WHERE so.idx = new.parentSOId;
END//
DELIMITER ;

До того, как появилась хранимая процедура, которая обновлялась для каждого отдельного заказа на продажу, даже если обновлялся только один счет-фактура, что означало 30 секунд для обновления одного счета-фактуры. Это была моя попытка обновить только точный родительский заказ на продажу. Однако, когда я проверил скорость и выполнил что-то, что повлияло на все идентификаторы счета% 5 = 0, я обнаружил что-то странное, что почти все мои заказы на продажу затронули 382 invoicesInPorgress.

Что я делаю неправильно? Как правильно обновлять родительскую строку дочерней строки по триггеру? Я понимаю, что вы, возможно, захотите сказать просто использовать представление, однако во многих местах нашего клиентского приложения на этот столбец уже ссылаются, и изменить все эти запросы будет непросто, мне было бы гораздо проще просто исправить как рассчитывается столбец.

1 Ответ

1 голос
/ 23 января 2020

Кажется, что условие подтира в подзапросе для COUNT, попробуйте это:

DELIMITER //
CREATE TRIGGER listinvoices_AUPD AFTER UPDATE ON listinvoices
FOR EACH ROW
BEGIN
UPDATE listsalesorders as so
SET so.invoicesInProgress = (SELECT COUNT(i.idx) FROM listinvoices i WHERE i.parentSOId=new.parentSOId AND (i.sentToContact = 1 or i.sentToAccounting=1))
WHERE so.idx = new.parentSOId;
END//
DELIMITER ;
...