我不知道为什么我的触发器不起作用,当我手动使用它时查询有效,但是当我想通过触发器更新它时它不起作用。有人能帮助我知道原因吗?
这是我的触发器:
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;。
答案 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
触发器中执行此操作。