首頁 >資料庫 >mysql教程 >為什麼 MySQL 會阻止儲存函數和觸發器中的資料表修改?

為什麼 MySQL 會阻止儲存函數和觸發器中的資料表修改?

Barbara Streisand
Barbara Streisand原創
2024-12-07 13:16:18283瀏覽

Why Does MySQL Block Table Modification in Stored Functions and Triggers?

MySQL 儲存函數/觸發器錯誤:表修改被封鎖

在MySQL 中執行儲存函數或觸發器時,可能會遇到錯誤:

Error: Can't update table 'brandnames' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

嘗試從儲存函數或觸發器內更新表時會發生此錯誤,由於潛在的死鎖或無限遞歸而禁止這樣做

INSERT 觸發器,例如提供的觸發器:

CREATE TRIGGER `capital` AFTER INSERT ON `brandnames`
FOR EACH ROW UPDATE brandnames
SET bname = CONCAT( UCASE( LEFT( bname, 1 ) ) , LCASE( SUBSTRING( bname, 2 ) ) )

嘗試在INSERT 作業仍處於活動狀態時更新品牌名稱表。 MySQL 會阻止這種情況,以保持資料完整性並避免潛在的錯誤。

要解決此問題,請考慮使用以下方法:

  • 存取新值: 使用 NEW .fieldname 用於存取 INSERT 操作期間設定的值。這允許您修改派生值而不影響表。
  • 使用 Before 觸發器: 如果可能,將表格修改邏輯移至 BEFORE INSERT 觸發器。這允許您在 INSERT 完成之前設定派生值,從而避免錯誤。

例如,以下觸發器會根據 full_name 欄位中的值更新small_name 欄位:

CREATE TRIGGER `capital` BEFORE INSERT ON `brandnames`
FOR EACH ROW BEGIN
  SET NEW.small_name = CONCAT(UCASE(LEFT(NEW.full_name,1)) , LCASE(SUBSTRING(NEW.full_name,2)))
END

以上是為什麼 MySQL 會阻止儲存函數和觸發器中的資料表修改?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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