mysql建表语句check约束不管用
代码如下
CREATE table message(
uid int not null PRIMARY KEY auto_increment COMMENT '用户id',
uname varchar(10) COMMENT '姓名',
sex char(2) COMMENT '性别' CHECK(sex='男' or sex='女'),
bir datetime COMMENT '出生日期',
hobby char(8) COMMENT '爱好',
pw char(8) COMMENT '密码',
tx BLOB COMMENT '头像',
dz varchar(20) COMMENT '地址',
phone char(11) COMMENT '电话',
qq char(11) COMMENT 'qq',
myself_pj text COMMENT '自我评价'
)COMMENT '信息表'
检查约束条件是‘女’ 或 ‘男’,但是填入其他信息却也可,是那一步出错了
因为在mysql中,不会检查并执行 CHECK 约束条件!仅仅只作为语句中语法的一部分!也就是说mysql并不支持检查约束(不确定高版本是不是支持),按我的理解:有这个东西只是在语法层面和常规的SQL语句相兼容
如果一定要使用检查约束,那么就可以用触发器!例如,可以创建一个 before insert 和 before update 触发器来实现相应的检查:
#在下面的代码中,创建了一个名为 check_sex 的 before insert 触发器,在每次插入新行之前检查 sex 列的值是否符合要求。
#如果不符合,则抛出一个 SQLSTATE 异常,显示一个错误消息。
CREATE TRIGGER check_sex BEFORE INSERT ON message
FOR EACH ROW
BEGIN
IF NEW.sex NOT IN ('男', '女') THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid value for sex column';
END IF;
END;
用的是哪个版本的mysql,这个是在8.0后才正式支持,看了5.7的文档,创建表的语句中没有问题,但是没有任何存储引擎支持这个操作
我在使用mysql建表语句时,使用了check约束来限制性别只能为‘女’或‘男’。但是当我往表中添加其他性别时,程序没有报错反而成功添加了。请问这是什么原因导致的?
在回答该问题前,先介绍一下数据表的结构和创建语句。
数据表名:users
字段名 | 类型 |
---|---|
id | int(11) |
name | char(20) |
gender | char(10) |
age | tinyint(3) |
其中,gender字段使用了check约束来限制只能为‘男’或‘女’。
check
约束语句:
check (gender in ('男', '女'))
针对该问题,我尝试了以下措施:
check (gender = '男' or gender = '女')
,仍然能够成功往表中添加其他性别。从上面的尝试来看,我们可以初步得出以下结论:
check
约束似乎不起作用。check
约束语句可能存在问题。针对第一个结论,我们可以得出一个可能的原因:check
约束在mysql中并不是常规的约束,可能不被支持。
针对第二个结论,我们可以对约束语句重新进行思考,尝试寻找更为准确的语法。经过查找资料,我们可以找到以下约束语句:
ENUM('男','女')
该语句可以限制列的值只能是两个固定的值之一,符合我们的需求。因此我们可以将语句修改为:
gender ENUM('男','女')
以下是修改后的建表语句:
CREATE TABLE users (
id int(11) NOT NULL AUTO_INCREMENT,
name char(20) NOT NULL,
gender ENUM('男','女') NOT NULL,
age tinyint(3) NOT NULL,
PRIMARY KEY (id)
);
该语句使用了ENUM
类型的字段来限制列的值只能是两个固定的值之一,与check
约束达到了相同的效果,但更为准确可靠。
综上所述,该问题的原因可能是check
约束在mysql中不被支持,建议使用ENUM
类型的字段代替。以下是修改后的建表语句:
CREATE TABLE users (
id int(11) NOT NULL AUTO_INCREMENT,
name char(20) NOT NULL,
gender ENUM('男','女') NOT NULL,
age tinyint(3) NOT NULL,
PRIMARY KEY (id)
);
其中,gender
字段使用了ENUM
类型来限制值只能是两个固定的值之一。