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

忽然笑
TA貢獻1806條經驗 獲得超5個贊
正確的語法是:
FOR EACH ROW SET NEW.bname = CONCAT( UCASE( LEFT( NEW.bname, 1 ) ) , LCASE( SUBSTRING( NEW.bname, 2 ) ) )

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);
添加回答
舉報
0/150
提交
取消