插入触发器减去值
Insert Trigger Subtracting Values
我目前正在做一个涉及几个 table 的小型项目:Invoice
和 Inventory
这两个 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;
我目前正在做一个涉及几个 table 的小型项目:Invoice
和 Inventory
这两个 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;