Mysql触发器未更新联接表
由于某些原因,此触发器没有更新订单表,我可能做得不正确Mysql触发器未更新联接表,mysql,triggers,Mysql,Triggers,由于某些原因,此触发器没有更新订单表,我可能做得不正确 DELIMITER $$ /*!50003 DROP TRIGGER*//*!50032 IF EXISTS */ /*!50003 `orderTotalInsert` */$$ /*!50003 CREATE */ /*!50017 DEFINER = 'root'@'localhost' */ /*!50003 TRIGGER `orderTotalInsert` AFTER INSERT ON `orderitem`
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 ;
t.orderitemId=order.OrderId
真的是正确的比较吗?子查询似乎是在其自身的orderid
上分组的,该ID引用Order
或者,如果我的假设是正确的,并且存在类似的UPDATE和DELETE触发器,那么您可以通过使用此更新查询来简化并降低此触发器的成本
UPDATE `Order` SET TotalAmmount = TotalAmmount + NEW.UnitPrice WHERE OrderId = NEW.OrderId;
对于更新,触发器将是SET totalamount=totalamount+NEW.UnitPrice-OLD.UnitPrice
select orderitemID, SUM(orderitem.UnitPrice) sum_price
from orderitem
group by orderitemID
对于删除,触发器将是SET totalamount=totalamount-OLD.UnitPrice
select orderitemID, SUM(orderitem.UnitPrice) sum_price
from orderitem
group by orderitemID
这按orderitemID
进行分组,我猜这是orderitem
表的主键。因为您是按唯一列分组的,“组”始终是1的组,“总和”始终等于每个单独的单价值
其效果是更新多次覆盖totalamount
,并获取订单的最后一个单价,而不是所有单价的总和
您应该按照orderID
进行分组,以便获得属于同一订单的所有orderitems的总数
select orderID, SUM(orderitem.UnitPrice) sum_price
from orderitem
group by orderID
第二个问题:您不需要在每次插入orderitem时更新所有订单。您只需要更新要插入的orderitem的一个订单的总计。因此,您应该将子查询限制在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
你真的用两个“M”拼写了“Order.TotalAmount”吗?哦,是的,我拼写了:/,谢谢你提醒我。谢谢比尔!这一个做到了。我确实不得不从每件事中提取额外的M,但似乎功能正常。