2014-05-04 112 views
0

我是新與我的SQL的工作,我開發一個觸發器在SQLSERVER運行完美,現在我想將它轉換,在MySQL中使用,但不工作,我不不知道該怎麼做。MYSQL TRIGGER子查詢更新

下面的代碼:

CREATE TRIGGER tg_test AFTER UPDATE ON YET FOR EACH ROW 

INSERT INTO CONTROLETRIGGER(idAluno, idNivel) 
values(NEW.IdAluno, NEW.idNivel); 


UPDATE HistoricoNivel AS E 
join(
select max(h.idNivel) Nivel, h.idAluno 
from HistoricoNivel h 
join CONTROLETRIGGER v on h.idaluno = v.idaluno 
WHERE h.dtFim is null 
group by h.idAluno 
)X on E.idAluno = X.idAluno and E.idNivel= X.Nivel 
join CONTROLETRIGGER vi on vi.idaluno = E.idAluno 
set E.dtFim = case when X.idnivel <> vi.idNivel then CURRENT_DATE() else null end 

請,我在做什麼錯?

Tks。

+0

什麼不起作用?它不是在編譯?沒有達到預期的效果? ...?另外,你可能想要顯示實際的觸發器,而不僅僅是查詢中的查詢(如果這是更新是...?) –

+0

它不是編譯,這是我的觸發器的代碼。 – FpontoDesenv

+0

好吧,如果你想有一個觸發'CREATE TRIGGER'肯定是缺少... –

回答

0

X子查詢沒有字段idnivel,所以case語句不會編譯。

我假設你想要的這裏是nivel,這將使充分觸發;

CREATE TRIGGER tg_test AFTER UPDATE ON YET FOR EACH ROW 
INSERT INTO CONTROLETRIGGER(idAluno, idNivel) VALUES (NEW.IdAluno, NEW.idNivel); 
UPDATE HistoricoNivel AS E 
JOIN(
    SELECT MAX(h.idNivel) Nivel, h.idAluno 
    FROM HistoricoNivel h 
    JOIN CONTROLETRIGGER v ON h.idaluno = v.idaluno 
    WHERE h.dtFim IS NULL 
    GROUP BY h.idAluno 
) X 
ON E.idAluno = X.idAluno AND E.idNivel= X.Nivel 
JOIN CONTROLETRIGGER vi ON vi.idaluno = E.idAluno 
SET E.dtFim = CASE WHEN X.nivel <> vi.idNivel THEN CURRENT_DATE() ELSE NULL END 
// 

See it compile here

+0

仍然沒有運行。我正在使用phpmyadmin。只有一個說法已經創建。當我讓兩個我得到一個錯誤在行2.可以是一個phpmyadmin的問題? – FpontoDesenv

+1

@FpontoDesenv添加它時需要更改分隔符,以便它不認爲proc在第一個';'結束。請注意,SQLfiddle更改爲'//'而不是';'。不知道如何在PHPmyadmin中做到這一點,但在普通的MySQL命令提示符下,添加proc和'delimiter;'之前,您會發出'delimiter //',然後再添加它。 –

+0

謝謝你,約阿希姆。我使用存儲過程做到這一點。 – FpontoDesenv