我有一个表 new
,其中包含列 stock
和 delivery_days
。
我需要在库存或交货日期发生变化时更新/插入行,触发器必须更新字段 status
可以通过调用函数 CheckStatus(stock, delivery_days) 并返回 0 或 1
我试过:
BEGIN
IF NEW.stock != OLD.stock or NEW.delivery_days != OLD.delivery_days
THEN
UPDATE new set status = CheckStatus(stock,delivery_days);
END IF;
END
但它不会运行,因为它会无限循环。
检查状态:
BEGIN
DECLARE `status` INT(11);
IF stock >= 1 and ddays = 0 THEN SET `status` = 1;
ELSE SET `status` = 0;
END IF;
RETURN `status`;
END
fiddle 示例 https://www.db-fiddle.com/f/tvGDajBRxUrHVvWjFnaiYu/0
最佳答案
当你想更改正在插入/更新的行的列时,不要使用UPDATE
,只需使用SET NEW.status = ...
即可仅更改生成触发器的当前行的值。
您还必须将其他列限定为 NEW.stock
和 NEW.delivery_days
。
BEGIN
IF NEW.stock != OLD.stock or NEW.delivery_days != OLD.delivery_days
THEN
SET NEW.status = CheckStatus(NEW.stock, NEW.delivery_days);
END IF;
END
我同意上面的评论,即您不应将表命名为 new
或任何其他 SQL keyword or reserved word ,因为这会使您的代码对任何阅读它的人造成混淆。
关于更新或插入时触发 mysql - 更新受影响行中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58695671/