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条经验 获得超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);
添加回答
举报
0/150
提交
取消