我似乎无法使这个触发器起作用。
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也有同样的看法。
答案 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
中有多行,则可能会返回错误。