由于某些原因,此触发器没有更新订单表,我可能做得不正确?
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条答案
按热度按时间webghufk1#
此分组依据
orderitemID
,我猜这是orderitem
table。因为您是按唯一列分组的,“组”总是1的组,“和”总是等于每个单独的单价值。结果是你的更新覆盖了
TotalAmmount
多次,并获取最后一个单价,而不是订单的所有单价之和。你应该按
orderID
,则得到属于同一订单的所有orderitems的总数。第二个问题:不需要每次插入orderitem时都更新所有订单。您只需要更新要插入的orderitem的一个订单的总数。所以应该将子查询限制为行
WHERE orderID = NEW.orderID
.mnemlml82#
是
t.orderitemId = order.OrderId
真的是正确的比较吗?似乎子查询将在orderid
它自己的,参考文献Order
.或者,如果我的假设是正确的,并且存在类似的update和delete触发器,那么您可以通过使用这个update查询来简化和降低这个触发器的成本。
因为更新触发器是
SET TotalAmmount = TotalAmmount + NEW.UnitPrice - OLD.UnitPrice
因为delete触发器是SET TotalAmmount = TotalAmmount - OLD.UnitPrice