我可以在触发器(mySQL)中使用嵌套的BEGIN / END块

时间:2015-12-07 19:49:48

标签: mysql database triggers nested block

我想知道为什么我的代码不起作用。 ideia用于验证当idseq添加到某个表时,查看是否已在任何其他表中存在相同的idseq。 以下代码在mySQL中生成ERROR 1235:

delimiter //

CREATE TRIGGER trigger_pagina
BEFORE INSERT ON pagina
    FOR EACH ROW
        BEGIN
            IF (EXISTS(
                SELECT R.idseq
                FROM registo R
                WHERE (NEW.idseq = R.idseq)
                ) )THEN
                    CALL Ilegal_Insert();
            END IF;
        END;

        BEGIN
            IF (EXISTS(
                SELECT T.idseq
                FROM tipo_registo T
                WHERE (NEW.idseq = T.idseq)
                )) THEN
                    CALL Ilegal_Insert();
            END IF;
        END;

        BEGIN
            IF (EXISTS(
                SELECT V.idseq
                FROM valor V
                WHERE (NEW.idseq = V.idseq)
                )) THEN
                    CALL Ilegal_Insert();
            END IF;
        END;

        BEGIN
            IF (EXISTS(
                SELECT C.idseq
                FROM campo C
                WHERE (NEW.idseq = C.idseq)
                )) THEN
                    CALL Ilegal_Insert();
            END IF;
        END;//

delimiter ;

提前致谢!

1 个答案:

答案 0 :(得分:0)

你需要另一个最外面的root块来封闭你上面的那些,比如

BEGIN ... END

这是因为 CREATE TRIGGER 实际上只允许触发器主体包含单个语句,并且 BEGIN ... END 被处理,及其内容,作为语句。

是的,你可以(在这种情况下必须)在触发器体中使用嵌套的 BEGIN ... END 块。