首页 文章

MySQL触发器定义 - 1064错误

提问于
浏览
1

我建议的触发器:

#START TRIGGER
delimiter //
DECLARE msg VARCHAR(255);
CREATE TRIGGER passStandard_check BEFORE INSERT ON Module
FOR EACH ROW 
BEGIN 
IF NEW.passStandard < 0 || NEW.passStandard > 1 THEN 
set msg = concat('Trigger Error: Pass Standard: ', cast(NEW.passStandard as char));
signal sqlstate '45000' set message_text = msg;
END
//
delimiter ;
#END TRIGGER

但是我收到以下错误:

错误代码:1064 . 您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在'DECLARE msg VARCHAR(255)附近使用正确的语法;在第1行插入Mod'之前创建TRIGGER passStandard_check

添加 END IF 没有任何区别 .

passStandard 设置为 INT NOT NULL .


编辑

我在 BEGIN 之后移动了 DECLARE 语句:

#START TRIGGER
delimiter //
CREATE TRIGGER passStandard_check BEFORE INSERT ON Module
FOR EACH ROW 
BEGIN 
DECLARE msg VARCHAR(255);
IF NEW.passStandard < 0 || NEW.passStandard > 1 THEN 
set msg = concat('Trigger Error: Pass Standard: ', cast(NEW.passStandard as char));
signal sqlstate '45000' set message_text = msg;
END IF;
END
//
delimiter ;
#END TRIGGER

但我仍然得到这个错误:

错误代码:1064 . 您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在'sqlstate'45000'set message_text = msg附近使用正确的语法;万一;在第7行结束

5 回答

  • 0

    您需要在过程中声明变量“msg”并使用END IF

    #START TRIGGER
    delimiter //
    CREATE TRIGGER passStandard_check BEFORE INSERT ON Module
    FOR EACH ROW 
    BEGIN 
        DECLARE msg VARCHAR(255); /* << PUT THIS HERE */
        IF NEW.passStandard < 0 || NEW.passStandard > 1 THEN 
            set msg = concat('Trigger Error: Pass Standard: ', cast(NEW.passStandard as char));
            signal sqlstate '45000' set message_text = msg;
        END IF; /* << YOU WILL NEED THIS TOO (DONT FORGET THE SEMICOLON :D) */
    END//
    delimiter ;
    #END TRIGGER
    
  • 0

    我注意到,如果我没有在IF语句中添加括号,在添加带有IF / ELSE逻辑的触发器时,我会收到MySQL警告 . 不知道为什么,但我添加了括号,警告消失了 . 尝试类似的东西:

    IF ((NEW.passStandard < 0) || (NEW.passStandard > 1)) THEN 
        set msg = concat('Trigger Error: Pass Standard: ', cast(NEW.passStandard as char));
        signal sqlstate '45000' set message_text = msg;
    END IF;
    
  • 2

    尝试将其分解为多个查询 . 或者在phpmyadmin中运行它,它处理半冒号分隔的多查询 .

  • 0

    可能是这样的:

    DECLARE只允许在BEGIN ... END复合语句中使用,并且必须在其开始之前,在任何其他语句之前 .

    http://dev.mysql.com/doc/refman/5.0/en/declare.html

  • 1

    我搞定了 . 请在工作代码下方找到 .

    delimiter //
    CREATE TRIGGER test_check1 BEFORE INSERT ON employee 
    FOR EACH ROW 
    BEGIN
    DECLARE msg VARCHAR(255); 
    IF (NEW.sync_id = '0') THEN 
    SET NEW.name = 'Collect Money'; 
    signal sqlstate '45000' set message_text = msg; 
    END IF; 
    END//
    delimiter ;
    

相关问题