我目前正在开展涉及几个表格的小型项目:Invoice
和Inventory
这两个表都有一个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
答案 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表。