我的MySQL触发器不起作用,语法简单,不复杂



我不知道为什么我的触发器不工作,当我手动使用它时,查询工作,但是当我想要由触发器更新时,它不工作。有人能告诉我为什么吗?

这是我的触发器:

    CREATE TRIGGER `upd_PTS` AFTER UPDATE ON `pos_table`
 FOR EACH ROW BEGIN
    IF (NEW.played_games <> OLD.played_games)
    THEN  
        update pos_table set PTS=((NEW.won_games*2)+(NEW.tie_games*1));
    END IF;
END

很简单,这是一个体育比赛,当统计人员捕获游戏的分数,他自动添加一个played_game和它各自的胜利,平局或输掉的游戏,所以我的触发器应该自动执行,当他played_games改变,它必须改变PTS列。但是它不工作。

也当我编辑played_games列手动我得到这个错误:"无法在存储函数/触发器中更新表pos_table,因为它已经被调用此存储函数/触发器的语句使用".

存储函数或触发器不能修改已经存在的表的语句使用(用于读取或写入)函数或触发器。

from: Stored program restrictions.

通常在插入时触发的触发器,如果想要更改插入的值,则将触发器类型设置为BEFORE INSERT并更改NEW中的值

也注意到下面的语句并不是你想要的。

update pos_table set PTS=((NEW.won_games*2)+(NEW.tie_games*1));

它更新整个表,而我认为你只是试图更新一个特定的行。不管怎样,这是一个简单的计算,所以你不需要存储这一列。您可以很容易地计算显示时的值,使您的代码更简单,并避免触发器的问题。

这段代码自己触发。无限循环或堆栈溢出....

正如@e4c5所提到的,即使您的触发器可以更新同一个表(它不能),您的update也会影响表的所有行,而不仅仅是当前正在更新的单行。

如果你想要一个触发器改变正在更新的行中的值,你可以使用SET:

CREATE TRIGGER `upd_PTS` BEFORE UPDATE ON `pos_table`
FOR EACH ROW BEGIN
   IF (NEW.played_games <> OLD.played_games)
   THEN  
       SET NEW.PTS = NEW.won_games*2 + NEW.tie_games*1;
   END IF;
END

还要注意,您不能更改导致触发器运行的行中的值,除非您在BEFORE触发器中这样做。

最新更新