首頁 > 資料庫 > mysql教程 > 為什麼我無法更新正在修改 MySQL 中相同表的觸發器內的表?

為什麼我無法更新正在修改 MySQL 中相同表的觸發器內的表?

Patricia Arquette
發布: 2024-11-08 22:52:02
原創
779 人瀏覽過

Why Can't I Update a Table Inside a Trigger That's Modifying the Same Table in MySQL?

觸發器故障排除:與表修改不相容

在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中文網其他相關文章!

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