首页  >  问答  >  正文

MySQL:无法更新存储函数/触发器中的表“订单”,因为它已被调用此存储函数/触发器的语句使用

我在 MySQL 数据库中有一个名为 orders 的表。在我们收到资金之前, payment_date 属性为 Null,此时它会更新为日期。一旦更新了 payment_date 属性, order_state 属性就会更新(手动!) 1 或2 变为值 3。

我想创建一个触发器来自动执行此流程。这是我的尝试:

DELIMITER $$

CREATE TRIGGER update_order_state

AFTER UPDATE
ON orders FOR EACH ROW
BEGIN
    IF ( NEW.payment_date IS NOT NULL AND NEW.order_state IN (1, 2) )
        THEN
        UPDATE orders SET order_state = 3 WHERE NEW.payment_date IS NOT NULL and NEW.order_state IN (1, 2);
    END IF;
END $$

DELIMITER ;

当我调用它时,我收到以下错误消息:

[HY000][1442] 无法更新存储函数/触发器中的表“orders”,因为它已被调用此存储函数/触发器的语句使用。

考虑到这可能是锁定的情况(或无限循环的风险),我将触发器更改为BEFORE UPDATE。但是,我收到了同样的错误消息。

我该如何解决这个问题?

谢谢!

P粉282627613P粉282627613258 天前543

全部回复(1)我来回复

  • P粉724737511

    P粉7247375112024-02-05 10:14:31

    好的,鉴于您在上面评论过,您只需要更新生成触发器的行,您可以在触发器主体中不使用 UPDATE 的情况下完成此操作。

    DELIMITER $$
    
    CREATE TRIGGER update_order_state
    BEFORE UPDATE
    ON orders FOR EACH ROW
    BEGIN
        IF ( NEW.payment_date IS NOT NULL AND NEW.order_state IN (1, 2) )
            THEN
            SET NEW.order_state = 3;
        END IF;
    END $$
    
    DELIMITER ;

    设置NEW.仅适用于生成触发器的相应行。

    触发器主体一次处理一行,由 FOR EACH ROW 指示。因此,如果生成此触发器的 UPDATE 操作涉及多行,则每次将处理一行。

    更改 NEW. 的任何值需要使用 BEFORE 触发器。一旦 AFTER 触发器运行,再更改任何值都为时已晚。

    回复
    0
  • 取消回复