觸發器故障排除:與表修改不相容
在MySQL 中,觸發器是一個強大的工具,用於根據特定事件自動執行資料庫操作。然而,當觸發器在執行中遇到問題時,故障排除至關重要。本文解決了 MySQL 觸發器無法運作時遇到的常見錯誤。
問題描述:
使用者報告其觸發器未更新特定欄位(PTS) ) 當 pos_table 中對應的 Played_games 欄位發生變更時。儘管手動執行查詢,但觸發器未能觸發更新。
觸發器結構:
CREATE TRIGGER `upd_PTS` AFTER UPDATE ON `pos_table` FOR EACH ROW BEGIN IF (NEW.played_games <> OLD.played_games) THEN update pos_table set PTS=((NEW.won_games*2)+(NEW.tie_games*1)); END IF; END
遇到錯誤:
當嘗試編輯Played_games 欄位時,用戶收到一條錯誤訊息:「無法更新儲存函數/觸發器中的表pos_table,因為它已被呼叫此儲存函數/觸發器的語句使用」。
解決方案:
問題源自於以下事實:觸發器試圖修改觸發事件(played_games 的更新)中引用的相同表 (pos_table)。如 MySQL 的儲存程式限制中所述,儲存函數或觸發器不能修改呼叫語句已在使用的表。
替代解決方案:
避免這個問題,建議使用 BEFORE INSERT 觸發器來取代。在這種情況下,可以如下修改觸發器:
CREATE TRIGGER `upd_PTS` BEFORE INSERT ON `pos_table` FOR EACH ROW BEGIN SET NEW.PTS = ((NEW.won_games*2)+(NEW.tie_games*1)); END
其他注意事項:
除了遇到的錯誤之外,本文也強調了以下問題:儲存像PTS 這樣的計算列。由於在顯示過程中可以輕鬆地從其他列計算它,因此避免將其儲存為單獨的列可能會更有效率且不易出錯。
以上是為什麼我無法更新正在修改 MySQL 中相同表的觸發器內的表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!