猿问

MySql错误:无法更新存储函数/触发器中的表,因为它已被调用此存储函数/触发器的语句使用

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 EACH

ROW UPDATE brandnames

SET bname = CONCAT( UCASE( LEFT( bname, 1 ) ) , LCASE( SUBSTRING( bname, 2 ) ) )

这个错误是什么意思?


红颜莎娜
浏览 2579回答 3
3回答

缥缈止盈

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

忽然笑

正确的语法是:FOR EACH ROW SET NEW.bname = CONCAT( UCASE( LEFT( NEW.bname, 1 ) )                                    , LCASE( SUBSTRING( NEW.bname, 2 ) ) )

ibeautiful

“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);
随时随地看视频慕课网APP

相关分类

MySQL
我要回答