2012-01-28 164 views
1

我建议触发:MySQL的触发器定义 - 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 

,但我得到了以下错误:

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE msg VARCHAR(255); CREATE TRIGGER passStandard_check BEFORE INSERT ON Mod' at line 1

添加在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 

但我仍然得到这个错误:

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'sqlstate '45000' set message_text = msg; END IF; END' at line 7

回答

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 
+0

不,不是这样。 (另请参阅@clime的答案) – 2012-01-28 01:48:28

+0

“END IF”后面的分号错过 – 2012-01-28 01:54:44

+0

不用哈哈。我已经添加了分号并更新了错误(虽然同样的错误) – 2012-01-28 01:58:55

0

试着将其分解为多个查询。或者在phpmyadmin中处理分号分隔的多查询。

0

可能是这样的:

DECLARE is permitted only inside a BEGIN ... END compound statement and must be at its start, before any other statements.

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

+0

不,不是这样。或者至少,不仅如此。查看编辑 – 2012-01-28 01:48:50

0

我发现我越来越MySQL的警告在他们的if/else逻辑添加触发器时,如果我不加括号的IF语句。不知道为什么,但我添加了括号和警告消失。尝试像这样:

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; 
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 ;