MYSQL触发器子查询更新
我刚开始使用SQL,我在SQLSERVER中开发了一个运行完美的触发器,现在我正在尝试将其转换为Mysql,但不起作用,我不知道该怎么办 代码如下:MYSQL触发器子查询更新,mysql,sql,phpmyadmin,Mysql,Sql,Phpmyadmin,我刚开始使用SQL,我在SQLSERVER中开发了一个运行完美的触发器,现在我正在尝试将其转换为Mysql,但不起作用,我不知道该怎么办 代码如下: 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( se
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.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
//
.什么不起作用?不是吗?没有达到预期的效果。。。?另外,你可能想显示实际的触发器,而不仅仅是其中的查询,如果这是更新的内容…?它没有编译,这是我的触发器的代码。好吧,如果你想要一个触发器,那么CREATE trigger肯定丢失了…哈哈哈,我知道这个@Joachim,我认为没有必要把它放在这里。仍然没有运行。我用的是phpmyadmin。仅创建了一个状态。当我把这两个都放进去时,我在第2行遇到了一个错误。phpmyadmin可能有问题吗?@FpontoDesenv添加分隔符时需要更改分隔符,这样它就不会认为过程在第一次结束时结束;。请注意,SQLFIDLE更改为//而不是;。不知道如何在PHPmyadmin中执行,但是在正常的MySQL命令提示符中,您需要在添加proc之前发出delimiter//和delimiter;添加后再返回。谢谢你,Joachim。我使用存储过程来实现这一点。