0

我有一张表warehouse,其中包含有关商店中文章的信息(文章 ID 作为外键和数量)。然后,我有另一个表,shoppinglist其中有一个客户 ID、文章 ID 和数量。可以说,该客户想购买 3 篇文章,但只有一篇文章可用。如何写一个trigger帮助我防止买太多的东西?

我试过这个:

DELIMITER $$ CREATE TRIGGER check BEFORE INSERT ON shoppinglist FOR EACH ROW BEGIN IF warehouse.quantity < shoppinglist.quantity THEN CALL fail('You cant buy that much'); END IF; END $$ DELIMITER;

但这似乎不起作用。我的意思是,当我这样做时:

INSERT INTO shoppinlist (clients_id, article_id, quantity) VALUES (1, 2, 100);

仓库中只有 2 篇 id = 2 的文章,没关系,这是可能的。我做错了什么?

4

1 回答 1

1

在您的代码中,warehouse.quantity 或 shoppingList.quantity 将引用哪些具体文章?此外,check是一个保留关键字。

尝试这个:

DELIMITER $$
CREATE TRIGGER qtyCheck BEFORE INSERT ON shoppinglist 
FOR EACH ROW 
BEGIN 
  SET @qty = (SELECT quantity FROM warehouse WHERE article_id = NEW.article_id);
  IF @qty < NEW.quantity THEN
    CALL fail('You cant buy that much'); 
  END IF; 
END $$ 
DELIMITER ;

请注意,我重命名了触发器,我猜是表上列的名称article_idwarehouse我使用了NEW变量而不是shoppingList触发器的主体,并且在分号之前需要一个空格DELIMITER ;,尽管这可能是发帖时错字。

fail最后,如果未定义函数,您可能会收到以下错误。它在我的系统中不存在...

ERROR 1305: PROCEDURE testing.fail does not exist
于 2013-02-06T22:16:17.373 回答