我的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
简单来说,这是一个体育赛事,当统计人员捕捉到比赛的分数时,他会自动添加一个playing_game,并且分别取得了胜利,平局或者丢失的比赛,所以当他改变了play_games时,我的触发器应该会自动执行,并且必须改变PTS专栏。 但它不工作。
另外,当我手动编辑plays_games列,我得到这个错误:“不能更新存储的函数/触发器中的表pos_table,因为它已经被调用这个存储的函数/触发器的语句使用”。
存储的函数或触发器不能修改调用该函数或触发器的语句(用于读取或写入)的表。
来自: 存储的程序限制 。
一般情况下,在插入时触发一个触发器,如果要更改正在插入的值,可以使用BEFORE INSERT
types的触发器,并更改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
触发器中执行此操作。