Mysql Trigger не обновляет объединенную таблицу - PullRequest
0 голосов
/ 20 сентября 2018

По какой-то причине этот триггер не обновляет таблицу Order, что я могу сделать неправильно?

DELIMITER $$

/*!50003 DROP TRIGGER*//*!50032 IF EXISTS */ /*!50003 `orderTotalInsert` */$$

/*!50003 CREATE */ /*!50017 DEFINER = 'root'@'localhost' */ /*!50003 TRIGGER `orderTotalInsert` 
    AFTER INSERT ON `orderitem` FOR EACH ROW 
    BEGIN
     UPDATE `Order`
    INNER JOIN (
        select orderitemID, SUM(orderitem.UnitPrice) sum_price
        from orderitem 
        group by orderitemID
    )  t on t.orderitemID = order.OrderId 
    SET  Order.TotalAmmount = t.sum_price;
    END */$$


DELIMITER ;

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018
select orderitemID, SUM(orderitem.UnitPrice) sum_price
from orderitem 
group by orderitemID

Это группирует по orderitemID, что, как я предполагаю, является первичным ключом таблицы orderitem.Поскольку вы группируете по уникальному столбцу, «группы» - это всегда группы по 1, а «сумма» всегда равна каждому отдельному значению цены за единицу.

В результате ваш UPDATE перезаписывает TotalAmmount несколько раз, и получает последнюю цену за единицу вместо суммы всех цен за единицу заказа.

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

select orderID, SUM(orderitem.UnitPrice) sum_price
from orderitem 
group by orderID

Вторая проблема: вам не нужно обновлять все ордера каждый раз, когда вы вставляете элемент ордера.Вам просто нужно обновить итоговую сумму за один заказ, для элемента заказа, который вы вводите.Поэтому вы должны ограничить подзапрос строками WHERE orderID = NEW.orderID.

CREATE DEFINER = 'root'@'localhost' TRIGGER `orderTotalInsert` 
AFTER INSERT ON `orderitem` FOR EACH ROW 
BEGIN
 UPDATE `Order`
 INNER JOIN (
    SELECT orderID, SUM(orderitem.UnitPrice) sum_price
    FROM orderitem
    WHERE orderID = NEW.orderID
    GROUP BY orderID
 )  t on t.orderID = order.OrderId 
 SET Order.TotalAmmount = t.sum_price;
END
0 голосов
/ 20 сентября 2018

Действительно ли t.orderitemId = order.OrderId правильное сравнение?Похоже, что подзапрос будет группироваться по orderid самостоятельно, что ссылается на Order.

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

UPDATE `Order` SET TotalAmmount = TotalAmmount + NEW.UnitPrice WHERE OrderId = NEW.OrderId;

для UPDATE TRIGGER будет SET TotalAmmount = TotalAmmount + NEW.UnitPrice - OLD.UnitPrice

для DELETE TRIGGER будет SET TotalAmmount = TotalAmmount - OLD.UnitPrice

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