插入触发器减去值

Insert Trigger Subtracting Values

我目前正在做一个涉及几个 table 的小型项目:InvoiceInventory

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

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

我假设您正在使用 SQL 基于您尝试过的语法的服务器。

你可以这样做:

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 table 捕获 Product_Id 和 Quantity 并在 UPDATE 语句中使用它们。请在此处查看有关 INSERTED table 的 MSDN 文档:https://msdn.microsoft.com/en-us/library/ms191300.aspx

正如@Damien_The_Unbeliever 在您的问题下的评论中提到的,如果您可以控制您的模式,您应该考虑不存储派生数据。您可以通过视图或其他结构轻松获取数据,而不会出现数据不同步的情况。

更新为original/accepted回答:正如其他人所指出的,上面没有考虑插入多条记录,在这种情况下你需要加入到INSERTED table.

批量插入时这样做会更好:

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;