更正mysql触发器语法以防止无限循环

更正mysql触发器语法以防止无限循环,mysql,sql,Mysql,Sql,我正在创建以下测试触发器,以便在执行更新操作时更新字段的值: CREATE TRIGGER `test_index` AFTER UPDATE ON `main_itemmaster` FOR EACH ROW UPDATE `main_itemmaster` SET `guid` = "hello" WHERE `id` = NEW.id; 但是,每当我更新此表时,都会出现以下错误: Can't update table 'main_itemmaster' in store

我正在创建以下测试触发器,以便在执行
更新操作时更新字段的值:

CREATE TRIGGER `test_index` 
AFTER UPDATE ON `main_itemmaster` 
FOR EACH ROW  
    UPDATE `main_itemmaster` SET `guid` = "hello" WHERE `id` = NEW.id; 
但是,每当我更新此表时,都会出现以下错误:

Can't update table 'main_itemmaster' in stored function/trigger 
because it is already used by statement which invoked this stored function/trigger.

为什么会发生这种情况?我将如何解决此问题?

您想做什么

很明显,您不能在更新时更新同一个表。。。它变成圆形

是否要在插入时更新?这应该是可能的:

CREATE TRIGGER `test_index` 
AFTER INSERT ON `main_itemmaster` 
FOR EACH ROW  
UPDATE `main_itemmaster` SET `guid` = "hello" WHERE `id` = NEW.id; 
我看到你的评论了。我提议:

delimiter //
CREATE TRIGGER test_index BEFORE UPDATE ON main_itemmaster
FOR EACH ROW
    BEGIN
    IF NEW.name <> OLD.name OR NEW.location<>OLD.location THEN
           SET NEW.guid = concat(NEW.name, NEW.location);
       END IF;
   END;//
delimiter ;
分隔符//
在更新主\u itemmaster之前创建触发器测试\u索引
每行
开始
如果NEW.name OLD.name或NEW.locationOLD.location,则
设置NEW.guid=concat(NEW.name,NEW.location);
如果结束;
结束//
定界符;
我测试了它,它工作了!如果您只更新一个字段,也可以


问候

谢谢你的回答。这就是我想要实现的目标。假设我有三个字段,
name+location+guid
,每当我更新行的位置或名称时,我还希望guid更新为
concat(name,location)
。我该怎么做呢?见更新的答案(我忘了放concat(NEW.name,NEW.location))。我对它进行了测试,效果良好。