使用if语句的MYSQL触发器

时间:2014-07-16 23:49:20

标签: mysql

我似乎无法使这个触发器起作用。

 CREATE TRIGGER class_check BEFORE INSERT ON Category
 DECLARE x VARCHAR(1);
 SET x = (SELECT Type1 FROM Category);
 IF (x<>'A') THEN
 CALL `'ERROR'`;
 END IF;
 IF (NEW.MxLen > 3 AND x ='M') THEN
 CALL `'ERROR LENGTH MUST BE LESS THAN 3 FOR M CLASS LICENSE'`;
 ELSEIF (NEW.MxLen > 5 AND x ='G') THEN
 CALL `'ERROR LENGTH MUST BE LESS THAN 5 FOR G CLASS LICENSE'`;
 ELSEIF (NEW.MxLen > 30) THEN
 CALL `'ERROR LENGTH MUST BE LESS THAN 30 FOR A,B,C,D,E CLASS LICENSE'`;
 END IF;

上面的触发器不能按照我想要的方式工作,我似乎无法找到问题。 基本上,我希望它检查Category表中的type1是否为A然后拍摄错误。每次我尝试添加A时,它仍会拍摄错误。 任何帮助,将不胜感激。我对BEFORE UPDATE也有同样的看法。

1 个答案:

答案 0 :(得分:0)

反引号正在逃避它们之间的任何名称,并说它是一个标识符。我怀疑你确实有这些名字的任何标识符。只需使用字符串的单引号:

通常,call之后会存储过程名称。我猜你真的希望signal引发错误:

CREATE TRIGGER class_check BEFORE INSERT ON Category
 DECLARE x VARCHAR(1);
 SET x = (SELECT Type1 FROM Category);
 IF (x <> 'A') THEN
     SIGNAL '45000' SET MESSAGE_TEXT = 'ERROR';
 END IF;
 IF (NEW.MxLen > 3 AND x ='M') THEN
     SIGNAL '45000' SET MESSAGE_TEXT = 'ERROR LENGTH MUST BE LESS THAN 3 FOR M CLASS LICENSE';
 ELSEIF (NEW.MxLen > 5 AND x ='G') THEN
     SIGNAL '45000' SET MESSAGE_TEXT = 'ERROR LENGTH MUST BE LESS THAN 5 FOR G CLASS LICENSE';
 ELSEIF (NEW.MxLen > 30) THEN
     SIGNAL '45000' SET MESSAGE_TEXT = 'ERROR LENGTH MUST BE LESS THAN 30 FOR A,B,C,D,E CLASS LICENSE';
 END IF;

此外,目前还不清楚这条线的作用:

 SET x = (SELECT Type1 FROM Category);

如果Category中有多行,则可能会返回错误。

相关问题