嘿伙计们我正在做一个生成多种类型锦标赛的网站,当我尝试更新" 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