Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的MySQL触发器没有';不起作用,语法简单,不复杂_Mysql_Triggers - Fatal编程技术网

我的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;
如果结束;
结束
还请注意,您不能更改导致触发器运行的行中的值,除非在触发器之前的
中进行更改