-1

我正在尝试更新导致触发器的表中的值。我知道错误的原因,但我需要解决方法。如果表中的 new.id = id 已经存在,我需要更新产品数量的旧值。我无法在触发器和存储的函数中更新它。我花了几个小时思考解决方案,我该怎么做?

DROP TRIGGER IF EXISTS insert_product_trigger;
delimiter //
CREATE TRIGGER insert_product_trigger
BEFORE INSERT ON product
FOR EACH ROW
BEGIN
IF exists(select id_product from product where id_product = new.id_product) THEN
update product set quantity = quantity + new.quantity where id_product = new.id_product;
END IF;
END; //
delimiter ;

如果产品存在,我需要更新数量的旧值(只需将插入中的新数量添加到旧数量中)并取消插入或如果不存在则插入

第 3 行的错误 1442 (HY000):无法更新存储函数/触发器中的表“产品”,因为它已被调用此存储函数/触发器的语句使用。

4

2 回答 2

0

如果产品具有唯一键或主键,则忘记触发器和

insert into product(id,qty) values (x,y)
on duplicate key update qty = qty + y;

https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

于 2020-11-06T14:25:48.103 回答
0

你不能使用触发器来做你想做的事情。触发器无法阻止 DML 语句(在本例中为 INSERT)继续执行,这似乎是您在这里想要做的。相反,您需要使用正确的 DML 语句:

INSERT INTO PRODUCT
  (ID_PRODUCT, QUANTITY)
VALUES
  (some_id_product, some_quantity)
ON DUPLICATE KEY UPDATE QUANTITY = QUANTITY + some_quantity
于 2020-11-06T14:35:57.853 回答