MySQL:無法更新儲存函數/觸發器中的表'訂單”,因為它已被呼叫此儲存函數/觸發器的語句使用
P粉282627613
P粉282627613 2024-02-04 11:46:04
0
1
554

我在 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學習者快速成長!