我的MySQL触发器没有';不起作用,语法简单,不复杂
我不知道为什么我的触发器不起作用,当我手动使用它时,查询会起作用,但是当我想被触发器更新时,它就不起作用了。有人能帮我知道为什么吗 这是我的扳机:我的MySQL触发器没有';不起作用,语法简单,不复杂,mysql,triggers,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=((N
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
pos\u表更新后创建触发器'upd\u PTS'`
每行开始
如果(新。玩过的游戏旧。玩过的游戏)
然后
更新pos_表集PTS=((新的.won_游戏*2)+(新的.tie_游戏*1));
如果结束;
结束
简单地说,这是一场体育比赛,当统计人员捕捉到比赛的分数时,他会自动添加一场已进行的比赛,以及相应的赢、平或输比赛,因此当他进行的比赛发生变化时,我的触发器会自动执行,并且必须更改PTS列。但它不起作用
此外,当我手动编辑played_games(已玩游戏)列时,我会出现以下错误:
“无法更新存储函数/触发器中的表pos_table,因为调用此存储函数/触发器的语句已使用它。”
存储的函数或触发器无法修改已存在的表
被调用
功能或触发器
发件人:
通常,对于insert时触发的触发器,如果要更改正在插入的值,请在insert之前进行类型为的触发器,并在NEW
中更改值
还注意到下面的语句并不是您想要的
update pos_table set PTS=((NEW.won_games*2)+(NEW.tie_games*1));
它更新了整个表,而我认为您只是在尝试更新一个sepcific行。无论如何,这是一个简单的计算,所以您实际上不需要存储此列。您可以在显示时轻松地计算值,并使代码更简单,同时避免触发器的问题
存储的函数或触发器无法修改已存在的表
被调用
功能或触发器
发件人:
通常,对于insert时触发的触发器,如果要更改正在插入的值,请在insert
之前进行类型为的触发器,并在NEW
中更改值
还注意到下面的语句并不是您想要的
update pos_table set PTS=((NEW.won_games*2)+(NEW.tie_games*1));
它更新了整个表,而我认为您只是在尝试更新一个sepcific行。无论如何,这是一个简单的计算,所以您实际上不需要存储此列。您可以在显示时轻松地计算值,并使代码更简单,同时避免触发器的问题。此代码会自动触发。无限循环或堆栈溢出…此代码会自动触发。无尽的循环或堆栈溢出…正如@e4c5所提到的,即使触发器可以更新同一个表(它不能),您的更新也会影响表的所有行,而不仅仅是当前正在更新的单行
如果希望触发器更改正在更新的行中的值,可以使用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
pos\u表更新前创建触发器'upd\u PTS'`
每行开始
如果(新。玩过的游戏旧。玩过的游戏)
然后
SET NEW.PTS=NEW.won_games*2+NEW.tie_games*1;
如果结束;
结束
还请注意,您不能更改导致触发器运行的行中的值,除非您在触发器之前的中进行更改。如@e4c5所述,即使触发器可以更新同一个表(它不能),您的更新也会影响表中的所有行,而不仅仅是当前正在更新的单行
如果希望触发器更改正在更新的行中的值,可以使用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
pos\u表更新前创建触发器'upd\u PTS'`
每行开始
如果(新。玩过的游戏旧。玩过的游戏)
然后
SET NEW.PTS=NEW.won_games*2+NEW.tie_games*1;
如果结束;
结束
还请注意,您不能更改导致触发器运行的行中的值,除非在触发器之前的中进行更改