我被一个问题弄糊涂了!
我已经使用MySQL设置了我的第一个检查约束,但不幸的是,我遇到了一个问题。当插入一个应该未通过测试的行时,仍会插入该行。
结构:
CREATE TABLE user (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
uname VARCHAR(10) NOT NULL,
fname VARCHAR(50) NOT NULL,
lname VARCHAR(50) NOT NULL,
mail VARCHAR(50) NOT NULL,
PRIMARY KEY (id),
CHECK (LENGTH(fname) > 30)
);
insert语句:
INSERT INTO user VALUES (null, 'user', 'Fname', 'Lname', 'mail@me.now');
fname列中的字符串长度应该太短,但它仍然被插入。
我很确定我错过了一些基本的东西。
3条答案
按热度按时间6vl6ewon1#
MySQL doesn't enforce CHECK constraints, on any engine。
这让我不禁要问,为什么要将
fname
列声明为VARCHAR(50),但又想强制它只能有30个字符长?也就是说,唯一的选择是使用触发器:
ktecyv1j2#
如上所述,你必须使用触发器,MySQL不支持
check
,当你在触发器块中有多个语句时,比如声明变量或控制流,你需要用begin
和end
启动它,并将触发器包含在两个delimiters
中:**注意:**如果使用MariaDB,则在第一个分隔符之后第二个分隔符之前使用
//
,否则如果使用MySQL,则使用$$
。7bsow1i63#
从Mysql 8.0.16开始,可以强制执行检查约束:
当您尝试插入长度不正确的数据时,将失败:
当您尝试插入正确长度的数据时,它会成功:
但是请注意,当varchar长度与约束长度匹配时,约束会出现意外行为,并且输入值比预期的要长:
发生了什么事?看起来MySQL正在将输入字符串截断为varchar长度,然后检查约束,这导致插入“123456780”,这不是期望的行为。作为一种解决方法,使varchar字段至少比约束长度长一个字符,检查将按预期进行验证:
然后尝试插入长于校验长度的数据: