在 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
变量是此触发器的本地变量,只能在其中访问。但是以 @
为前缀的变量是用户变量,它们存储在会话中,可以在当前连接内的任何地方访问。它们将在您的触发器执行后持续存在。您必须删除声明并使用用户变量,或者从变量名称中删除 @
并使用局部声明的变量。
我在创建触发器时遇到了一点问题,因为我必须声明一些变量,然后使用它们进行一些更新操作。无论如何,我将粘贴代码及其抛出的错误,希望有人会告诉我我做错了什么。谢谢
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
变量是此触发器的本地变量,只能在其中访问。但是以 @
为前缀的变量是用户变量,它们存储在会话中,可以在当前连接内的任何地方访问。它们将在您的触发器执行后持续存在。您必须删除声明并使用用户变量,或者从变量名称中删除 @
并使用局部声明的变量。