更新後嘗試在其自己的觸發器內更新同一表時會出現常見的挑戰。當觸發器被設計為根據同一行中其他列的變更來修改表中的特定列時,這一點變得很明顯。
考慮以下場景,其中我們希望每次得分時更新「products_score」表中的「votes_t otal」列已修改:
CREATE TRIGGER upd_total_votes AFTER UPDATE ON products_score FOR EACH ROW UPDATE products_score SET products_score.votes_total = (SELECT (votes_1 + votes_2 + votes_3 + votes_4 + votes_5) FROM products_score WHERE id = new.id)
但是,在對錶執行更新時,我們遇到錯誤:
#1442 - Can't update table 'products_score' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
此錯誤是由觸發器邏輯中的循環引用引起的。更新語句嘗試修改「votes_total」列,觸發器也依賴該列來計算新的總數。
要避免此問題,我們可以將觸發器修改為在更新之前而不是之後執行:
CREATE TRIGGER upd_total_votes BEFORE UPDATE ON products_score FOR EACH ROW BEGIN SET new.votes_total = new.votes_1 + new.votes_2 + new.votes_3 + new.votes_4 + new.votes_5 END ;
在這個修改後的觸發器中,我們計算新的“votes_total”值並分配它在實際更新發生之前到“新”行物件。這允許更新語句繼續進行而不會遇到循環引用問題。
以上是如何解決MySQL觸發器導致的表更新錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!