首頁  >  問答  >  主體

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 天前541

全部回覆(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
  • 取消回覆