首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mysql触发器不更新联接表

Mysql触发器不更新联接表
EN

Stack Overflow用户
提问于 2018-09-20 17:46:52
回答 2查看 22关注 0票数 1

由于某些原因,此触发器没有更新Order表,我可能做错了什么?

代码语言:javascript
运行
复制
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 ;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-20 18:06:34

代码语言:javascript
运行
复制
select orderitemID, SUM(orderitem.UnitPrice) sum_price
from orderitem 
group by orderitemID

这个组由orderitemID组成,我猜这是orderitem表的主键。因为您是按一个唯一的列进行分组,所以“组”总是由1组成的组,而"sum“总是等于每个单独的单价值。

结果是,您的更新多次覆盖TotalAmmount,并获得最后一个单位价格,而不是订单的所有单位价格之和。

您应该按orderID进行分组,因此您将得到属于同一订单的所有订单项的总数。

代码语言:javascript
运行
复制
select orderID, SUM(orderitem.UnitPrice) sum_price
from orderitem 
group by orderID

第二个问题:您不需要每次插入订单项时都更新所有订单。您只需更新一份订单的总数,即要插入的订单项。因此,您应该将子查询限制为行WHERE orderID = NEW.orderID

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2018-09-20 18:00:46

t.orderitemId = order.OrderId真的是正确的比较吗?子查询似乎是在自己的orderid上分组,引用Order

或者,如果我的假设是正确的,并且存在类似的UPDATE和DELETE触发器,则可以使用此更新查询来简化和降低此触发器的成本。

代码语言:javascript
运行
复制
UPDATE `Order` SET TotalAmmount = TotalAmmount + NEW.UnitPrice WHERE OrderId = NEW.OrderId;

对于更新触发器,将是SET TotalAmmount = TotalAmmount + NEW.UnitPrice - OLD.UnitPrice

对于删除触发器,将是SET TotalAmmount = TotalAmmount - OLD.UnitPrice

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52430584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档