首頁 >資料庫 >mysql教程 >為什麼我無法更新 MySQL 儲存函數或觸發器中的表?

為什麼我無法更新 MySQL 儲存函數或觸發器中的表?

Linda Hamilton
Linda Hamilton原創
2024-12-25 00:05:20826瀏覽

Why Can't I Update a Table Within a MySQL Stored Function or Trigger?

MySQL 錯誤:無法更新存儲函數/觸發器中的表

問題:

嘗試使用觸發器向MySQL表中插入新行時,出現以下錯誤發生:

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

答案:

當INSERT 觸發器嘗試修改調用它的表時,會遇到此錯誤。 MySQL 禁止這種行為有兩個主要原因:

  • 鎖定衝突: INSERT 可能會執行鎖定操作,如果觸發器也嘗試鎖定表,則可能導致死鎖。
  • 無限遞歸:如果觸發器更新同一個表中的一行,它可以導致同一觸發器無限期地觸發,從而導致無限循環。

要解決此錯誤,請考慮使用以下方法:

  • 存取新值: 不要在觸發器中修改表,而是使用NEW.fieldname 存取新插入的值並設定其他欄位
  • 預先插入修改: 使用BEFORE INSERT 觸發器在將值插入表之前修改值。這可以避免無限遞歸問題。

例如,要從全名的前兩個字元建立短名稱字段,可以使用以下 BEFORE INSERT 觸發器:

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

以上是為什麼我無法更新 MySQL 儲存函數或觸發器中的表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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