为了账号安全,请及时绑定邮箱和手机立即绑定

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条经验 获得超5个赞

“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 关注
  • 2578 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信