【问题标题】:My MySQL trigger doesn't work, simple syntax, not complicated我的mysql触发器不起作用,语法简单,不复杂
【发布时间】:2016-12-16 19:06:27
【问题描述】:

我不知道为什么我的触发器不起作用,当我手动使用它时查询可以工作,但是当我想通过触发器进行更新时它不起作用。有人可以帮我知道为什么吗?

这是我的触发器:

    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

很简单,这是针对体育比赛的,当统计人员捕获比赛的得分时,他会自动添加 play_game 并且分别是赢、平或输的比赛,所以当他 play_games 更改并且它有时,我的触发器应该自动执行更改 PTS 列。但它不起作用。

此外,当我手动编辑played_games 列时,我收到此错误: “无法更新存储函数/触发器中的表 pos_table,因为它已被调用此存储函数/触发器的语句使用”。

【问题讨论】:

    标签: mysql triggers


    【解决方案1】:

    存储的函数或触发器无法修改已经存在的表 被调用 函数或触发器。

    来自:Stored program restrictions

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

    还注意到下面的语句无论如何都不是你想要的。

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

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

    【讨论】:

      【解决方案2】:

      此代码会自行触发。无限循环或堆栈溢出......

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-22
          • 2019-01-17
          • 2012-09-04
          • 2013-04-26
          • 2013-05-26
          • 2016-08-12
          相关资源
          最近更新 更多