由于某些原因,此触发器没有更新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 ;发布于 2018-09-20 18:06:34
select orderitemID, SUM(orderitem.UnitPrice) sum_price
from orderitem
group by orderitemID这个组由orderitemID组成,我猜这是orderitem表的主键。因为您是按一个唯一的列进行分组,所以“组”总是由1组成的组,而"sum“总是等于每个单独的单价值。
结果是,您的更新多次覆盖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发布于 2018-09-20 18:00:46
t.orderitemId = order.OrderId真的是正确的比较吗?子查询似乎是在自己的orderid上分组,引用Order。
或者,如果我的假设是正确的,并且存在类似的UPDATE和DELETE触发器,则可以使用此更新查询来简化和降低此触发器的成本。
UPDATE `Order` SET TotalAmmount = TotalAmmount + NEW.UnitPrice WHERE OrderId = NEW.OrderId;对于更新触发器,将是SET TotalAmmount = TotalAmmount + NEW.UnitPrice - OLD.UnitPrice
对于删除触发器,将是SET TotalAmmount = TotalAmmount - OLD.UnitPrice。
https://stackoverflow.com/questions/52430584
复制相似问题