受影响行中的更新或插入-更新字段时触发mysql

受影响行中的更新或插入-更新字段时触发mysql,mysql,function,triggers,Mysql,Function,Triggers,我有一个表new,其中有stock和delivery\u 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 我需要在更新/插入行时,当库存或交货天数发生变化时,触发器必须更新字段状态,可通过调用函数CheckSt

我有一个表
new
,其中有
stock
delivery\u 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
我需要在更新/插入行时,当库存或交货天数发生变化时,触发器必须更新字段
状态
,可通过调用函数CheckStatus(库存、交货天数)接收该字段,并返回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 example

当您想要更改正在插入/更新的行的列时,不要使用
UPDATE
,只需使用
SET NEW.status=…
,它将仅更改生成触发器的当前行上的值

您还必须将其他列限定为
NEW.stock
NEW.delivery\u 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

我同意上面的评论,即您不应将表命名为“新建”或任何其他名称,因为这会使阅读您的代码的人感到困惑。

请显示“创建表”和一些数据。同时称桌子为新的是个坏主意。我会用一个更好的名称创建一个新表,并创建一个新的触发器,然后对其进行测试。在Fiddle上添加的示例您无法操作触发触发器的表(即您无法更新新的)我理解,P.Salmon您已经在我关于此问题的另一个问题中回答了我。现在我使用的是
where CheckStatus(…)=?
但它在大表上运行缓慢,所以我需要带有状态和索引的实列。我想在糟糕的sql中这样做,因为在客户端,有人可能忘记更新
状态