MySql不支持CHECK Clause所以我认为我必须在桌子上使用TRIGGER
在一个简单的表格中,我们有两个观点字段必须在的字段('正常','坏','好'):
CREATE TABLE `user`.`opinionTable` (
`uid` INT NOT NULL,
`opinion` VARCHAR(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`uid`,`opinion`),
CHECK (opinion IN ('normal','bad','good'))
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;
我想检查意见数据是一个允许的值('正常','坏','好')或否,什么时候不允许我想要交易回滚
我试过这个TRIGGER但没有用,所以正确的TRIGGER声明是什么?
CREATE TRIGGER check_values BEFORE INSERT ON `opinionTable`
FOR EACH ROW
BEGIN
IF (NEW.opinion IN ('normal','bad','good'))
THEN
END IF;
END
我抓住了这个例外:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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 'END IF;
mysql版本是5.1.34社区
jdbc版本是5.1.23
答案 0 :(得分:1)
如果输入不匹配,有两种方法可以实现检查约束。
SIGNAL
错误并中止交易。 示例1 : 强制使用默认值
您可以定义使用default
值以在遇到无效输入时静默使用。
IF ( LOWER( NEW.opinion ) NOT IN ('normal','bad','good')) THEN
SET default_opinion := 'normal'; -- declare this field first
NEW.opinion := default_opinion; -- change its value as desired
ELSE
NEW.opinion := LOWER( NEW.opinion ); -- change this as desired
END IF;
示例2 : SIGNAL
错误并中止交易
定义案例的错误状态编号和相关的错误消息
使用相同的SIGNAL
错误。
IF ( LOWER( NEW.opinion ) NOT IN ('normal','bad','good')) THEN
-- don't forget to declare variables first and then use
SET error_message := CONCAT( 'Invalid opinion option: ', NEW.opinion );
-- set proper error state number -- 302478 is just an example
SIGNAL SQLSTATE '302478' SET MESSAGE_TEXT := error_message;
END IF;