每次修改事务表时创建一个更新“total_price”对象的触发器

时间:2017-10-30 16:55:22

标签: mysql database

我正在为大学项目创建一个简单的web_shop数据库,它需要存储用户过去的订单并显示订单的总成本。我一直试图解决这个问题几个小时

使用当前的触发器,当我尝试在我的“事务”表中插入更多行时,我收到错误:

ERROR 1242 (21000): Subquery returns more than 1 row

并且每个收据/订单的“总价格”显示为“17 .9”(对于receipt_id'1',它们应为17.9,对于receipt_id'2',它们应为3.5)。收据是一组交易(例如receipt_id = 5 - > 5个橙子,3个香蕉和1个苹果总价12.50美元

通过以下(3)触发器计算

sub_total(交易)(项目*数量的价格):

CREATE TRIGGER calcsub_insert BEFORE INSERT/BEFORE UPDATE/AFTER UPDATE
FOR EACH ROW
BEGIN
    SET NEW.sub_total = NEW.transaction_price * NEW. transaction_quantity;
END

total_price(收据)目前通过以下(3)触发器计算:

CREATE TRIGGER BEFORE INSERT/BEFORE UPDATE/AFTER DELETE ON transactions
FOR EACH ROW
UPDATE receipt
    SET total_price = (SELECT SUM(sub_total) FROM transactions GROUP BY receipt_id)

我已经在下面包含了我的架构,希望能让情况更加清晰。我认为'group by'将返回每个receipt_id的所有总计,但它似乎不起作用。感谢您提前获得任何帮助或提示!

webshop db schema

1 个答案:

答案 0 :(得分:0)

SELECT ... GROUP BY receipt_id查询将为receipt_id的每个不同值返回一行。

也许我们只想为receipt_id的单个值返回一行。触发触发器的transactions行的值。

 SELECT SUM(t.sub_total) FROM transaction t WHERE t.receipt_id = NEW.receipt_id 

似乎我们只想更新receipt中匹配receipt_id

的行
 UPDATE receipt r 
    ... 
  WHERE r.receipt_id = NEW.receipt_id

(表transactions的名称(在触发器定义中引用)应该与SELECT查询中引用的表transaction的名称相同吗?现在,它有点令人困惑,因为看起来它们引用了两个不同的表。)

触发器的时机似乎有点奇怪......在新行添加到transactions之前从transactions计算总数,而不是总计{在应用更改后更新。我们也希望在引用它之前确保sub_total的值已分配。 (现在MySQL 5.7允许在表上有多个BEFORE INSERT触发器,如果​​我们要有多个触发器,我们需要注意触发器触发的顺序是否有依赖。

(然后,我对用例没有了解。)

另外需要考虑的边缘情况......修改transactions的{​​{1}}的更新...似乎可能会有两个可能受影响的receipt_id值。请考虑此更新:

receipt_id

好像我们想要更新UPDATE `transactions` t SET t.receipt_id = 3333 WHERE t.receipt_id = 2222 AND t.transaction_id = 111 表中的两行...一行receipt,另一行r.receipt_id = OLD.receipt_id

r.receipt_id = NEW.receipt_id时,我们只会有一行要更新。我们只需要在OLD.receipt_id = NEW.receipt_id时更新两行。