mysql - 触发器将所有已售商品的价格和输出添加到发票表
问题描述
我有三个表:项目、已售和发票。item 表跟踪单个项目的价格和描述,sold 表跟踪属于特定发票的项目,Invoice 跟踪日期和其他信息。发票与已售出具有一对多关系,已售出与商品具有一对多关系。
以下是我表中的相关列: invoice(invoiceID, total) sold(soldID, invoiceID, itemID) item(itemID, description, price)
如果不手动汇总项目,我目前无法跟踪发票的总价。发票中的合计栏必须手动插入。
我正在寻找一个触发器来查找我出售的所有具有与 invoiceID 匹配的外键的行,然后添加相关项目的价格并将其输出到发票。
如果这是不可能的,我还可以添加一个新的价格列来销售,然后使用多个触发器最终按我的方式开发票。
我无法对数据库的结构进行任何重大更改,因此如果可能的话,最好保持字段和关系不变。
如果有人对如何创建此触发器有任何意见,我们将不胜感激。
解决方案
@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 也是。请考虑一下。
推荐阅读
- python - 按组和时间戳订购 Pandas DataFrame
- python - Win10更新后python Idle停止工作
- php - Laravel/php 三足 OAuth
- opengl - 在片段着色器 (GLSL) 中获取表面大小
- tensorflow - 了解 TensorFlow 数据集的结构
- c++ - OpenMP 并行化 std::next_permutation
- acumatica - 批准时间活动中未显示活动
- python - 无法创建新连接节点 JS RethinkDbDash
- python - 使用 ffmpeg-python 设置转换后的输出文件的帧率
- python - 从熊猫数据框中获取索引值