【问题标题】:Need Guidance with writing MySQL Trigger需要指导编写 MySQL 触发器
【发布时间】:2021-09-11 23:23:14
【问题描述】:

我承认,这是我的第一个 MySQL 触发器。 MySQL 版本为 8.0。

我有一个订单和订单行项目表。在订单表中,我有一列存储所有行项目的总数。我需要一个触发器,每次为该订单添加或更改订单项时更新总数。到目前为止,这是我所拥有的:

CREATE TRIGGER update_line_item_total
AFTER INSERT
   ON orderlines.price FOR EACH ROW

BEGIN

   -- variable declarations
   DECLARE li_order_id INT;
   DECLARE li_total DEC;

   SET li_order_id = orderlines.order_id; 
   SET li_total = SUM (orderlines.price) WHERE orderlines.order_id = li_order_id;

   -- trigger code
   UPDATE orders SET 
    total_lineitems = li_total
    WHERE orders.order_id = li_order_id;
END;

我将它放入 MySQL Workbench 并被拒绝。我知道 DECLARE 语句、第二个 SET 语句和 END 语句被标记为不正确,但是我什至不知道在哪里可以找出问题所在。

寻找指导和方向。

谢谢,

迈克尔·弗兰克尔 Wizard Consulting Group, Inc.

【问题讨论】:

  • 停下来,只是不要。数据应保持无冗余以避免出现不一致的可能性。因此,将一张表上的总和写入另一张表并不是一件好事。如果您需要总和,您可以随时查询并获得 正确 结果。为方便起见,您可以创建一个存储此类查询的视图,这样您就不必每次都重复它。

标签: mysql mysql-workbench


【解决方案1】:
  1. 您的问题出在这一行:SET li_total = SUM (orderlines.price) WHERE orderlines.order_id = li_order_id;

  2. 添加分隔符。

这样做:

delimiter |
CREATE TRIGGER update_line_item_total
AFTER INSERT
   ON orderlines.price FOR EACH ROW

BEGIN

   -- variable declarations
   DECLARE li_order_id INT;
   DECLARE li_total DEC;
   declare li_total_temp dec;

   SET li_order_id = orderlines.order_id; 
   select orderlines.price into li_total_temp  WHERE orderlines.order_id = li_order_id;
   SET li_total =  li_total + li_total_temp;

   -- trigger code
   UPDATE orders SET 
    total_lineitems = li_total
    WHERE orders.order_id = li_order_id;
END |
delimiter ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多