无法弄清楚此触发器在何处循环错误#1442 MySQL

时间:2016-05-30 17:08:20

标签: mysql sql triggers

嘿伙计们我正在做一个生成多种类型锦标赛的网站,当我尝试更新" punteggio(点)"时,我会继续在phpmyadmin上收到此错误。我的数据库上的列,以便它可以自动生成锦标赛的下一阶段,我相信触发器是循环但我无法弄清楚在哪里。

我使用phpmyadmin gui界面创建触发器。

只有当我启用第二个触发器时才会弹出此错误。第一个触发器正常工作而没有第二个触发器。

这是错误

  

#1442 - 无法更新表格' Partecipa'在存储的函数/触发器中   因为它已被调用此存储的语句使用   功能/触发。

翻译:

Gara =匹配;
Torneo =锦标赛;
punteggio =点
vincitori =获奖者
fase =阶段

TRIGGER FUNCTION I(Partecipa更新后):更新了punteggio(或点)后将触发此功能

BEGIN 

    SET @garamodificata = NEW.Gara_id_Gara;

    SET @punteggio = (SELECT Punteggio FROM Partecipa WHERE Gara_id_Gara = @garamodificata AND Punteggio != NEW.Punteggio );

    SET @verifica = (SELECT Id_gara FROM Vincitori WHERE Id_gara = @garamodificata);
    SET @verificaEliminazioneDiretta = (SELECT Tipo_torneo FROM Torneo WHERE Id_torneo = NEW.Gara_Torneo_Id_torneo);


IF(@verificaEliminazioneDiretta = "Eliminazione Diretta") THEN

    IF(@verifica IS NULL ) THEN 
        IF(@punteggio > NEW.Punteggio) THEN 
            SET @giocatore = (SELECT Giocatore_id_Giocatore FROM Partecipa WHERE Gara_id_Gara = @garamodificata AND Punteggio = @punteggio);
            INSERT INTO Vincitori(Id_gara,Id_giocatore)VALUES(@garamodificata,@giocatore);

        ELSEIF(@punteggio < NEW.Punteggio) THEN 
            SET @giocatore = (SELECT Giocatore_id_Giocatore FROM Partecipa WHERE Gara_id_Gara = @garamodificata AND Punteggio = NEW.Punteggio);
            INSERT INTO Vincitori(Id_gara,Id_giocatore)VALUES(@garamodificata,@giocatore);
        END IF;

        ELSE 
        IF(@punteggio> NEW.Punteggio) THEN 
            SET @giocatore = (SELECT Giocatore_id_Giocatore FROM Partecipa WHERE Gara_id_Gara = @garamodificata AND Punteggio = @punteggio);
            UPDATE Vincitori SET Id_giocatore = @giocatore WHERE Id_gara = @garamodificata;

        ELSEIF(@punteggio < NEW.Punteggio) THEN 
            SET @giocatore = (SELECT Giocatore_id_Giocatore FROM Partecipa WHERE Gara_id_Gara = @garamodificata AND Punteggio = NEW.Punteggio);
            UPDATE Vincitori SET Id_giocatore = @giocatore WHERE Id_gara = @garamodificata;
        END IF;

    END IF;
END IF;

END

TRIGGER FUNCTION(在Vincitori上插入触发器后):此功能在下一阶段的新比赛中插入,并且它是Vincitori上的AFTER INSERT TRIGGER

BEGIN 


SET @fase = (SELECT MAX(Fase)FROM Partecipa WHERE Gara_id_Gara = NEW.Id_gara); #phase of the tournament
SET @torneo = (SELECT Torneo_Id_torneo From Gara WHERE id_Gara = NEW.Id_gara); #id of the tournament 
SET @expectedResults = (SELECT COUNT(*)FROM Partecipa WHERE  Fase = @fase AND Gara_Torneo_Id_torneo = @torneo)/2; #number of results needed to generate next phase
SET @actualResults =(SELECT COUNT(*) FROM Vincitori INNER JOIN Partecipa ON Vincitori.Id_gara = Partecipa.Gara_id_Gara WHERE Partecipa.Gara_Torneo_Id_torneo = @torneo AND Partecipa.Fase = @fase)/2;
#numberof results in Vincitori 

SET @i = 1;
SET @j = 2;


IF(@expectedResults = @actualResults) THEN

    CREATE TEMPORARY TABLE gare(id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, id_giocatore VARCHAR(45),id_gara INT(11));
    INSERT INTO gare(id_giocatore,id_gara)
    SELECT DISTINCT Vincitori.id_giocatore,Vincitori.id_Gara
    FROM Vincitori INNER JOIN Partecipa ON Vincitori.Id_gara = Partecipa.Gara_id_Gara WHERE Partecipa.Gara_Torneo_Id_torneo = @torneo;


    SET @garedagenerare = (@actualResults/2)+1;
    SET @fase = @fase + 1;   

    WHILE (@i < @garedagenerare) DO
        SET @idprossimagara = (SELECT DISTINCT MAX(id_gara) FROM gare);
        SET @idprossimagara = (@idprossimagara + 1);
        SET @datagara = (SELECT DISTINCT Data_gara FROM Gara WHERE id_Gara = @idprossimagara); 

        SET @Player1 = (SELECT DISTINCT id_giocatore FROM gare WHERE id = @i);
        SET @Player2 = (SELECT DISTINCT id_giocatore FROM gare WHERE id = @j);

        INSERT INTO Partecipa VALUES(@Player1,@idprossimagara,@torneo,0,@datagara,@fase);
        INSERT INTO Partecipa VALUES(@Player2,@idprossimagara,@torneo,0,@datagara,@fase);

        SET @i = @i+2;
        SET @j = @j+2;

    END WHILE;

END IF;


END

0 个答案:

没有答案