2013-06-01 92 views
1

那么这里更新库存的问题......我想在我的数据库,其中包括我怎样才能使用TRIGGER

Sale(ProductID,Quantity,Price)     
Invlevel(ProductID,Quantity) 

我希望使用触发器,此更新更新库存表。我必须使用2个触发器(我认为)。 1,在销售表,这将是这样的

CREATE TRIGGER `sale_AINS` AFTER INSERT ON sale FOR EACH ROW 
begin 
update Invlevel set quantity = Invlevel.quantity-"sale.quantity" where 
Invlevel.ProductID = "sale.ProductID"; 
END 

这个触发器,当销售出现,我想调整在该销售来到了产品的库存水平。然而,即使这个触发器没有错误,并且在我插入销售表时不能正常运行,它也不会在Invlevel表中进行任何更改,我不知道为什么(:@)。

而且,我在Invlevel表像

CREATE TRIGGER `invlevel_AUPD` after UPDATE on invlevel FOR EACH ROW 
if invlevel.quantity < 20 
begin 
insert into orders 
(select productid,amount from reorder where reorder.productid = invlevel.productid) 
end 

*由触发器(订单,订货是其他表)

这对我说:我有我不知道语法错误它是什么,甚至即使我找到它我甚至无法检查逻辑,因为其他触发器甚至不能正常工作......任何关于它的想法或帮助将非常有帮助。

回答

3

尝试

首先触发

CREATE TRIGGER sale_AINS 
AFTER INSERT ON sale 
FOR EACH ROW 
    UPDATE invlevel 
    SET quantity = quantity - NEW.quantity 
    WHERE productid = NEW.productid; 

在这种触发你不需要BEGIN END块,因为只有一个声明。为了访问列值或插入的行,您需要使用NEW关键字。

,第二个

DELIMITER $$ 
CREATE TRIGGER invlevel_AUPD 
AFTER UPDATE ON invlevel 
FOR EACH ROW 
BEGIN 
    IF NEW.quantity < 20 THEN 
    INSERT INTO orders (productid, amount) 
    SELECT productid, amount 
     FROM reorder 
    WHERE productid = NEW.productid; 
    END IF; 
END$$ 
DELIMITER ; 

在第二个触发IF声明是出于BEGIN END块和语法IF的是错误的。它应该是IF ... THEN ... END IF;。和NEW关键字一样的问题。

这里是SQLFiddle演示

你可以把你IF条件为WHERE条款,使其更简洁这样

CREATE TRIGGER invlevel_AUPD 
AFTER UPDATE ON invlevel 
FOR EACH ROW 
    INSERT INTO orders (productid, amount) 
    SELECT productid, amount 
    FROM reorder 
    WHERE productid = NEW.productid 
    AND NEW.quantity < 20; 

这里更新SQLFiddle演示

+0

谢谢你真的很有帮助 – user2432398

+0

@ user2432398不客气。我很高兴它帮助:) – peterm