在 MySql 错误中声明创建触发器的变量

Declaring variables creating a trigger in MySql error

我在创建触发器时遇到了一点问题,因为我必须声明一些变量,然后使用它们进行一些更新操作。无论如何,我将粘贴代码及其抛出的错误,希望有人会告诉我我做错了什么。谢谢

    CREATE TRIGGER trg_league_info
    AFTER UPDATE ON matchs
    BEGIN
       DECLARE HomeTotalMatchCount ,HomeWinMatchCount ,HomeDrawMatchCount ,HomeLossMatchCount ,HomeLeagueScore ,HomeAgainstGoal ,HomeForGoal ,HomeAverage INT DEFAULT 0;

       DECLARE AwayTotalMatchCount ,AwayWinMatchCount ,AwayDrawMatchCount ,AwayLossMatchCount ,AwayLeagueScore ,AwayAgainstGoal ,AwayForGoal ,AwayAverage INT DEFAULT 0;

       DECLARE HomeTeamID ,AwayTeamID ,HomeScore ,AwayScore ,SeasonID ,Status INT DEFAULT 0;

       SELECT @HomeTeamID=HomeID, @AwayTeamID=AwayID , @HomeScore=HomeScore , @AwayScore=AwayScore ,@SeasonID=SeasonID , @Status=Status FROM inserted;

       IF (@Status == 2) THEN
          SELECT @HomeTotalMatchCount=LeagueTotalMatchCount , @HomeWinMatchCount=LeagueWinCount , @HomeDrawMatchCount=LeagueDrawCount , @HomeLossMatchCount=LeagueLossCount  , @HomeAgainstGoal=LeagueAgaintsGoalCount , @HomeForGoal=LeagueForGoalCount , @HomeAverage=    LeagueAvarage , @HomeLeagueScore = LeagueScore FROM team_info WHERE TeamID == @HomeTeamID AND SeasonID==@SeasonID;
          SELECT @AwayTotalMatchCount=LeagueTotalMatchCount , @AwayWinMatchCount=LeagueWinCount , @AwayDrawMatchCount=LeagueDrawCount , @AwayLossMatchCount=LeagueLossCount  , @AwayAgainstGoal=LeagueAgaintsGoalCount , @AwayForGoal=LeagueForGoalCount , @AwayAverage=    LeagueAvarage , @AwayLeagueScore = LeagueScore FROM team_info WHERE TeamID == @AwayTeamID AND SeasonID==@SeasonID;
        
          IF (@HomeScore>@AwayScore) THEN
             uPDATE team_info SET LeagueTotalMatchCount=@HomeTotalMatchCount+1 ,LeagueWinCount=@HomeWinMatchCount+1, LeagueAgaintsGoalCount=@HomeAgainstGoal+@AwayScore , LeagueForGoalCount=@HomeForGoal+@HomeScore, LeagueScore=@HomeLeagueScore+3 WHERE TeamID == @HomeTeamID AND SeasonID==@SeasonID;
             uPDATE team_info SET LeagueTotalMatchCount=@AwayTotalMatchCount+1 ,LeagueLossCount=@AwayLossMatchCount+1, LeagueAgaintsGoalCount=@AwayAgainstGoal+@HomeScore , LeagueForGoalCount=@AwayForGoal+@AwayScore, LeagueScore=@AwayLeagueScore+1 WHERE TeamID == @AwayTeamID AND SeasonID==@SeasonID;
          ELSEIF (@HomeScore==@AwayScore) THEN
             uPDATE team_info SET LeagueTotalMatchCount=@HomeTotalMatchCount+1 ,LeagueDrawCount=@HomeDrawMatchCount+1, LeagueAgaintsGoalCount=@HomeAgainstGoal+@AwayScore , LeagueForGoalCount=@HomeForGoal+@HomeScore, LeagueScore=@HomeLeagueScore+2 WHERE TeamID == @HomeTeamID AND SeasonID==@SeasonID;
             uPDATE team_info SET LeagueTotalMatchCount=@AwayTotalMatchCount+1 ,LeagueDrawCount=@AwayDrawMatchCount+1, LeagueAgaintsGoalCount=@AwayAgainstGoal+@HomeScore , LeagueForGoalCount=@AwayForGoal+@AwayScore, LeagueScore=@AwayLeagueScore+2 WHERE TeamID == @AwayTeamID AND SeasonID==@SeasonID;
          ELSE
             uPDATE team_info SET LeagueTotalMatchCount=@HomeTotalMatchCount+1 ,LeagueLossCount=@HomeLossMatchCount+1, LeagueAgaintsGoalCount=@HomeAgainstGoal+@AwayScore , LeagueForGoalCount=@HomeForGoal+@HomeScore, LeagueScore=@HomeLeagueScore+1 WHERE TeamID == @HomeTeamID AND SeasonID==@SeasonID;
             uPDATE team_info SET LeagueTotalMatchCount=@AwayTotalMatchCount+1 ,LeagueWinCount=@AwayWinMatchCount+1, LeagueAgaintsGoalCount=@AwayAgainstGoal+@HomeScore , LeagueForGoalCount=@AwayForGoal+@AwayScore, LeagueScore=@AwayLeagueScore+3 WHERE TeamID == @AwayTeamID AND SeasonID==@SeasonID;
          END IF;    
       END IF;  
    END

它抛出以下错误:

1064 - 您的 SQL 语法有误;查看与您的 MariaDB 服务器版本对应的手册,了解在第 3

行 'BEGIN DECLARE HomeTotalMatchCount ,HomeWinMatchCount ,HomeDrawMatchCount ,H' 附近使用的正确语法

上次我写触发器是在 MSSQL 服务器上写的,语法有点不同。也许我只需要创建一个过程并调用它。所以,如果有人能提供帮助,我将不胜感激。

您使用的触发器语法错误。勾选manual,必须添加FOR EACH ROW构造。像这样:

CREATE TRIGGER trg_league_info
AFTER UPDATE ON matchs
FOR EACH ROW
BEGIN
...
END;

另外请注意,您是在声明变量,而不是使用它们。 HomeTotalMatchCount@HomeTotalMatchCount 是 MySQL 中的不同变量。您的 HomeTotalMatchCount 变量是此触发器的本地变量,只能在其中访问。但是以 @ 为前缀的变量是用户变量,它们存储在会话中,可以在当前连接内的任何地方访问。它们将在您的触发器执行后持续存在。您必须删除声明并使用用户变量,或者从变量名称中删除 @ 并使用局部声明的变量。