我不知道为什么我的触发器不工作,当我手动使用它时,查询工作,但是当我想要由触发器更新时,它不工作。有人能告诉我为什么吗?
这是我的触发器:
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
触发器中这样做。