gpt4 book ai didi

mysql - MySql 中的 TRIGGER 代替 CHECK 子句

转载 作者:行者123 更新时间:2023-11-29 11:51:59 24 4
gpt4 key购买 nike

MySql 不支持 CHECK 子句,所以我想我必须在表上使用 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. 强制使用默认值。
  2. 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;

关于mysql - MySql 中的 TRIGGER 代替 CHECK 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33910758/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com