MySQL:无法更新存储函数/触发器中的表'订单”,因为它已被调用此存储函数/触发器的语句使用
P粉282627613
P粉282627613 2024-02-04 11:46:04
0
1
521

我在 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粉282627613
P粉282627613

全部回复(1)
P粉724737511

好的,鉴于您在上面评论过,您只需要更新生成触发器的行,您可以在触发器主体中不使用 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 触发器运行,再更改任何值都为时已晚。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!