我在 MySQL 資料庫中有一個名為 orders
的表。在我們收到資金之前, payment_date
屬性為 Null,此時它會更新為日期。一旦更新了 payment_date code> 屬性,
order_state code> 屬性就會更新(手動!) 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粉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
觸發器運行,再更改任何值都為時已晚。