插入触发器减去值

时间:2015-04-22 13:42:06

标签: sql triggers

我目前正在开展涉及几个表格的小型项目:InvoiceInventory

这两个表都有一个Product_Id和一个Quantity,我需要编写一个触发器,以便在创建(插入)新的Invoice时,它会减少产品的数量。 ; Inventory表中的数量。非常感谢任何帮助。

CREATE TRIGGER tr_UpdateQuantity
ON Invoice
AFTER INSERT
AS 
BEGIN
  UPDATE Inventory 
    SET Inventory.Quantity = Inventory.Quantity - Invoice.Quantity
    FROM Invoice
    WHERE Inventory.Product_Id = Invoice.Product_Id
END

2 个答案:

答案 0 :(得分:3)

如果您为批量插入执行此操作会更好:

CREATE TRIGGER tr_UpdateQuantity ON Invoice
AFTER INSERT
AS 
BEGIN

   UPDATE inv
   SET Quantity = Quantity - i.Quantity
   FROM Inventory inv
   JOIN (SELECT Product_ID, SUM(Quantity) AS Quantity FROM INSERTED GROUP BY Product_ID) i ON inv.Product_ID = i.Product_ID

END;

答案 1 :(得分:0)

我假设您已根据您尝试过的语法使用SQL Server。

你可以这样做:

CREATE TRIGGER tr_UpdateQuantity
ON Invoice
AFTER INSERT
AS 
BEGIN
DECLARE 
@ProductId numeric,
@Quantity numeric

    SELECT @ProductId = INSERTED.Product_Id,
          @Quantity = INSERTED.quantity
    FROM INSERTED

  UPDATE Inventory 
    SET Quantity = Quantity - @Quantity
    WHERE Product_Id = @ProductId

END;

基本上,您从INSERTED表中捕获Product_Id和Quantity,并在UPDATE语句中使用它们。请参阅此处INSERTED表上的MSDN文档:https://msdn.microsoft.com/en-us/library/ms191300.aspx

正如@Damien_The_Unbeliever在您提出的评论中所提到的,如果您对架构有任何控制权,则应考虑不存储派生数据。您可以通过视图或其他结构轻松获取数据,而不会使数据不同步。

更新为原始/已接受的答案:正如其他人所指出的,上述内容并未考虑插入多条记录,在这种情况下,您需要加入INSERTED表。