如何使用 TRIGGER 更新库存

use*_*398 2 mysql sql triggers

问题是这样...我想更新我的数据库中的库存表,其中包括

Sale(ProductID,Quantity,Price)                 
Invlevel(ProductID,Quantity)
Run Code Online (Sandbox Code Playgroud)

我想使用触发器来进行此更新。我必须使用 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
Run Code Online (Sandbox Code Playgroud)

有了这个触发器,当销售出现时,我想调整销售所涉及的产品的库存水平。然而,即使这个触发器没有错误并且当我插入销售表时运行正常,它也不会在 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
Run Code Online (Sandbox Code Playgroud)

*(订单、重新排序是其他表)

它对我说我有语法错误,我不知道它是什么,而且即使我找到它,我什至无法检查逻辑,因为另一个触发器甚至无法工作......对此有任何想法或帮助真的很有帮助。

pet*_*erm 5

尝试

第一次触发

CREATE TRIGGER sale_AINS
AFTER INSERT ON sale 
FOR EACH ROW
  UPDATE invlevel 
     SET quantity = quantity - NEW.quantity
   WHERE productid = NEW.productid;
Run Code Online (Sandbox Code Playgroud)

在此触发器中,您不需要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 ;
Run Code Online (Sandbox Code Playgroud)

在第二个触发器中,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;
Run Code Online (Sandbox Code Playgroud)

这是更新的SQLFiddle演示