首頁 >資料庫 >mysql教程 >使用更新後觸發器時如何防止「無法更新儲存函數/觸發器中的表」錯誤?

使用更新後觸發器時如何防止「無法更新儲存函數/觸發器中的表」錯誤?

Linda Hamilton
Linda Hamilton原創
2024-12-26 22:28:14713瀏覽

How Can I Prevent

同一表更新後觸發更新

在資料庫系統中,觸發器用於在表中發生某些事件時自動執行特定操作。在更新表後嘗試從觸發器內更新同一個表時,會出現一個常見的挑戰。

考慮以下觸發器:

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);

當嘗試如下更新表時:

UPDATE products_score SET votes_1 = 5 WHERE id = 0;

觸發器失敗並出現錯誤:

#1442 - Can't update table 'products_score' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
要解決此問題,觸發器必須修改為在更新事件之前執行,而不是之後。這允許觸發器在應用原始更新語句之前更新表:

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 列更新。

以上是使用更新後觸發器時如何防止「無法更新儲存函數/觸發器中的表」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn