使用触发器插入后更新另一个表?

Posted

技术标签:

【中文标题】使用触发器插入后更新另一个表?【英文标题】:Update another table after insert using a trigger? 【发布时间】:2013-08-16 02:39:08 【问题描述】:

我目前正在创建某种库存系统。

我有 tbl1 我保存项目的位置。在tbl1,我有专栏qty 或剩余可用库存。

tbl1:

id product  qty
1  mouse    10
2  keyboard 15
3  monitor  8

我还有一张表tbl2,我在其中保存了发行项目的所有交易。在这个表中有issued_qty

tbl2

id requested_by product  issued_qty
1  john         mouse    2

我的问题是如何在tbl2 中插入一行,同时更新tbl1.qty (tbl1.qty - tbl2.issued_qty)

例如: 当我在request_by、product 和qty_issued 中的tbl2 中插入记录时,我希望tbl1 自动更新。因为我们向 John 发放了 2 个(数量)鼠标。 tbl1中鼠标的记录,应该自动减到no。 tbl2中的发行数量

我的想法是使用TRIGGER

但不幸的是我没有成功..你能帮我解决这个问题吗..

谢谢。

【问题讨论】:

【参考方案1】:

如果您不希望有大量数据,请使用视图或存储过程即时计算并返回实际数量。从长远来看,它可能会为您省去很多麻烦。

您的视图(实际上是视图)可能看起来像

CREATE VIEW vw_table2_sum AS
SELECT product, SUM(issued_qty) qty
  FROM Table2
 GROUP BY product;

CREATE VIEW vw_table1 AS
SELECT t.id, t.product, t.qty - COALESCE(v.qty, 0) qty
  FROM Table1 t LEFT JOIN vw_table2_sum v
    ON t.product = v.product;

当我们这样做时

SELECT * FROM vw_table1;

会得到

|身份证 |产品 |数量 | ---------------------- | 1 |鼠标 | 8 | -- 数量是当前的 | 2 |键盘 | 15 | | 3 |显示器 | 8 |

这里是SQLFiddle演示

现在,如果您出于某种原因想要使用触发器管理库存数量,它可能看起来像这样

CREATE TRIGGER tg_ai_table2
AFTER INSERT ON table2
FOR EACH ROW
  UPDATE Table1
     SET qty = qty - NEW.issued_qty
   WHERE product = NEW.product;

这里是SQLFiddle演示

【讨论】:

哇,非常感谢彼得姆爵士。这就是我现在要找的一个星期。

以上是关于使用触发器插入后更新另一个表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用触发器的 SQL 插入后更新另一个表

插入更新另一个表后创建触发器

使用触发器插入/更新到另一个表

使用触发器将值插入另一个表,除非值存在,在这种情况下更新

创建触发器:通过将数据插入另一个表行来更新表列

触发器 当往一个表中插入数据时,更新另一个表,报语法错误...