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

时间:2016-11-09 23:30:50

标签: mysql triggers

我不知道为什么我的触发器不起作用,当我手动使用它时查询有效,但是当我想通过触发器更新它时它不起作用。有人能帮助我知道原因吗?

这是我的触发器:

    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

简单,它适用于体育比赛,当统计人员捕捉到游戏的分数时,他会自动添加一个plays_game及其相应的赢,平局或丢失的游戏,因此我的触发器应该执行当play_games发生变化时,它会自动更改,并且必须更改PTS列。但它不起作用。

当我手动编辑playing_games列时,我收到此错误: &#34;无法更新存储函数/触发器中的表pos_table,因为它已经被调用此存储函数/触发器的语句使用了#34;。

3 个答案:

答案 0 :(得分:2)

  

存储的函数或触发器无法修改已经存在的表   被调用的语句用于(读或写)   功能或触发器。

来自:Stored program restrictions

通常使用在插入时触发的触发器,如果​​要更改正在插入的值,则触发类型BEFORE INSERT并更改NEW

中的值

还注意到以下陈述不是你想要的。

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

它会更新整个表,而我认为您只是尝试更新一个特定的行。无论如何,这是一个简单的计算,因此您不需要存储此列。您可以在显示时轻松计算值,并使代码更简单+避免触发器的问题。

答案 1 :(得分:1)

此代码触发自身。无尽的循环或堆栈溢出......

答案 2 :(得分:0)

正如@ 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触发器中执行此操作。