MySQL触发器定义 - 1064错误

时间:2012-01-28 01:37:02

标签: mysql triggers mysql-error-1064

我建议的触发器:

#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


修改

我在DECLARE

之后移动了BEGIN语句
#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 :(得分:2)

您需要在程序中声明变量“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

答案 1 :(得分:1)

如果我没有在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 :(得分:0)

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

答案 3 :(得分:0)

可能是这样的:

  

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

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

答案 4 :(得分:0)

我得到了它的工作。请在工作代码下方找到。

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 ;