Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql触发器未更新联接表_Mysql_Triggers - Fatal编程技术网

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,但似乎功能正常。