mysql触发器未更新联接表

7uzetpgm  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(352)

由于某些原因,此触发器没有更新订单表,我可能做得不正确?

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 ;
webghufk

webghufk1#

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

此分组依据 orderitemID ,我猜这是 orderitem table。因为您是按唯一列分组的,“组”总是1的组,“和”总是等于每个单独的单价值。
结果是你的更新覆盖了 TotalAmmount 多次,并获取最后一个单价,而不是订单的所有单价之和。
你应该按 orderID ,则得到属于同一订单的所有orderitems的总数。

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

第二个问题:不需要每次插入orderitem时都更新所有订单。您只需要更新要插入的orderitem的一个订单的总数。所以应该将子查询限制为行 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
mnemlml8

mnemlml82#

t.orderitemId = order.OrderId 真的是正确的比较吗?似乎子查询将在 orderid 它自己的,参考文献 Order .
或者,如果我的假设是正确的,并且存在类似的update和delete触发器,那么您可以通过使用这个update查询来简化和降低这个触发器的成本。

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

因为更新触发器是 SET TotalAmmount = TotalAmmount + NEW.UnitPrice - OLD.UnitPrice 因为delete触发器是 SET TotalAmmount = TotalAmmount - OLD.UnitPrice

相关问题