亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

MySql錯誤:無法更新存儲函數/觸發器中的表,因為它已被調用此存儲函數/觸發器的語句使用

MySql錯誤:無法更新存儲函數/觸發器中的表,因為它已被調用此存儲函數/觸發器的語句使用

紅顏莎娜 2019-08-28 10:07:09
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.從代碼:CREATE TRIGGER `capital` AFTER INSERT ON `brandnames`FOR EACHROW UPDATE brandnamesSET bname = CONCAT( UCASE( LEFT( bname, 1 ) ) , LCASE( SUBSTRING( bname, 2 ) ) )這個錯誤是什么意思?
查看完整描述

3 回答

?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

INSERT觸發器觸發時,您無法更改表。INSERT可能會執行某些鎖定,這可能會導致死鎖。此外,從觸發器更新表將導致相同的觸發器在無限遞歸循環中再次觸發。這兩個原因都是MySQL阻止你這樣做的原因。

但是,根據您要實現的目標,您可以使用NEW.fieldname訪問新值,甚至可以使用舊值(如果使用OLD進行更新)來訪問新值。

如果您有一行命名,full_brand_name并且您希望在字段中使用前兩個字母作為短名稱,則small_name可以使用:

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


查看完整回答
反對 回復 2019-08-28
?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

正確的語法是:

FOR EACH ROW SET NEW.bname = CONCAT( UCASE( LEFT( NEW.bname, 1 ) )
                                   , LCASE( SUBSTRING( NEW.bname, 2 ) ) )


查看完整回答
反對 回復 2019-08-28
?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

“BEFORE-INSERT”-trigger是在插入上實現相同表更新的唯一方法,并且只能從MySQL 5.5+中實現。但是,自動增量字段的值僅適用于“AFTER-INSERT”觸發器 - 在BEFORE情況下默認為0。因此,以下示例代碼將根據自動增量值設置先前計算的代理鍵值id,但不會實際工作,因為NEW.id將始終為0:

create table products(id int not null auto_increment, surrogatekey varchar(10), description text);create trigger trgProductSurrogatekey before insert on productfor each row set NEW.surrogatekey = 
  (select surrogatekey from surrogatekeys where id = NEW.id);


查看完整回答
反對 回復 2019-08-28
  • 3 回答
  • 0 關注
  • 2716 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號