首頁 > 資料庫 > mysql教程 > 如何解決MySQL觸發器導致的表更新錯誤?

如何解決MySQL觸發器導致的表更新錯誤?

DDD
發布: 2024-12-26 22:44:13
原創
221 人瀏覽過

How to Resolve the MySQL Trigger-Induced Table Update Error?

觸發器引發的表更新困境

更新後嘗試在其自己的觸發器內更新同一表時會出現常見的挑戰。當觸發器被設計為根據同一行中其他列的變更來修改表中的特定列時,這一點變得很明顯。

範例:計算列總計

考慮以下場景,其中我們希望每次得分時更新「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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板