而不是在MySql

时间:2015-11-25 07:29:38

标签: mysql jdbc triggers

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

1 个答案:

答案 0 :(得分:1)

如果输入不匹配,有两种方法可以实现检查约束。

  1. 强制使用默认值。
  2. SIGNAL错误并中止交易。
  3. 示例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;