首页 > 解决方案 > 触发器将所有已售商品的价格和输出添加到发票表

问题描述

我有三个表:项目、已售和发票。item 表跟踪单个项目的价格和描述,sold 表跟踪属于特定发票的项目,Invoice 跟踪日期和其他信息。发票与已售出具有一对多关系,已售出与商品具有一对多关系。

以下是我表中的相关列: invoice(invoiceID, total) sold(soldID, invoiceID, itemID) item(itemID, description, price)

如果不手动汇总项目,我目前无法跟踪发票的总价。发票中的合计栏必须手动插入。

我正在寻找一个触发器来查找我出售的所有具有与 invoiceID 匹配的外键的行,然后添加相关项目的价格并将其输出到发票。

如果这是不可能的,我还可以添加一个新的价格列来销售,然后使用多个触发器最终按我的方式开发票。

我无法对数据库的结构进行任何重大更改,因此如果可能的话,最好保持字段和关系不变。

如果有人对如何创建此触发器有任何意见,我们将不胜感激。

标签: mysqltriggers

解决方案


@stickybit 完全正确。您不想要冗余数据。您不应将任何类型的派生总计放入发票记录中。相反,您应该通过查询或视图来获取它。

使用 SQL 的新手有时很难相信,但查询和视图通常与检索总计之类的聚合一样快。

从应用软件的角度来看,视图和表格看起来完全一样。因此,请查看显示总数的发票。像这样的东西。

 CREATE OR REPLACE VIEW invoice_with_totals AS
 SELECT sold.invoiceId, SUM(price) total
   FROM sold
   JOIN item ON sold.itemID = item.itemID
  GROUP BY invoiceID

信不信由你,以这种方式使用视图来做事将在未来为您(或将使用您的应用程序的人)省去各种故障排除的麻烦。如果您以这种方式进行操作,那么您的总数根本不可能与发票中的详细信息不一致。如果您使用触发器,则无法保证。而且,你知道,墨菲定律,大客户,错误的发票,你明白了......

我有来之不易的经验支持我的建议。我怀疑@stickybit 也是。请考虑一下。


推荐阅读