mysql的check约束

mysql图形界面建表,如何才能添加check约束?例如给sex添加“男”、“女”和“保密”。

根据多年使用MySQL经验,不建议使用 枚举类,至少我接触过的几个大项目没有见过。

建议统一在 应用层进行校验,减少不必要的 数据库I/O开支。

另外,字段定义为枚举类,也有一定的局限性,使用 汉字 和 0~9 的数字 有很大不同,枚举字段类型中如果使用0,则会赋 null 值。

CREATE TABLE `tmp_user_detail_t`(
    `id` BIGINT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增长主键',
    `user_name` VARCHAR(100) NOT NULL COMMENT '姓名',
    `sex1` ENUM('男','女','秘密') NOT NULL COMMENT '性别',
    `sex2` ENUM('1','2','3') NOT NULL COMMENT '性别(0:女、1:男、2:秘密)',
    `sex3` VARCHAR(4) NOT NULL COMMENT '性别(女、男、秘密)',
    `sex4` TINYINT NOT NULL COMMENT '性别(0:女、1:男、2:秘密)',
    PRIMARY KEY (`id`) USING BTREE
)
COMMENT='用户信息基表'
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DYNAMIC
AUTO_INCREMENT=1
;

INSERT INTO `tmp_user_detail_t`(user_name, sex1, sex2, sex3, sex4) VALUES("小王", '女', '1', '男', 1);
INSERT INTO `tmp_user_detail_t`(user_name, sex1, sex2, sex3, sex4) VALUES("小王", '男', '2', '男', 2);
INSERT INTO `tmp_user_detail_t`(user_name, sex1, sex2, sex3, sex4) VALUES("小王", '秘密', '3', '男', 3);
-- 插入失败:SQL错误(1265):Data truncated for column 'sex2' at row 1
INSERT INTO `tmp_user_detail_t`(user_name, sex1, sex2, sex3, sex4) VALUES("小王", '未知', '3', '男', 3);


INSERT INTO `tmp_user_detail_t`(user_name, sex1, sex2, sex3, sex4) VALUES("小王", '男', '1', '男', 1);
INSERT INTO `tmp_user_detail_t`(user_name, sex1, sex2, sex3, sex4) VALUES("小王", '男', '2', '男', 2);
INSERT INTO `tmp_user_detail_t`(user_name, sex1, sex2, sex3, sex4) VALUES("小王", '男', '3', '男', 3);
-- 插入成功,但 sex2 为 null
INSERT INTO `tmp_user_detail_t`(user_name, sex1, sex2, sex3, sex4) VALUES("小王", '男', '0', '男', 2);
-- 插入失败:SQL错误(1265):Data truncated for column 'sex2' at row 1
INSERT INTO `tmp_user_detail_t`(user_name, sex1, sex2, sex3, sex4) VALUES("小王", '男', '4', '男', 2);

INSERT INTO `tmp_user_detail_t`(user_name, sex1, sex2, sex3, sex4) VALUES("小王", '男', '2', '女', 1);
INSERT INTO `tmp_user_detail_t`(user_name, sex1, sex2, sex3, sex4) VALUES("小王", '男', '2', '男', 2);
INSERT INTO `tmp_user_detail_t`(user_name, sex1, sex2, sex3, sex4) VALUES("小王", '男', '2', '秘密', 3);
INSERT INTO `tmp_user_detail_t`(user_name, sex1, sex2, sex3, sex4) VALUES("小王", '男', '2', '未知', 3);

这篇博客也有说明:

在 MySQL 中使用枚举的陷阱一定要注意!_肥肥技术宅的博客-CSDN博客 enum类型的字段对于0与‘0’有非常大的区别,如果你是用0当角标做操作,因它没有这个角标,所要会报错;如果你使用‘0’这个值去取枚举值,并做插入操作,你会发现它竟然会成功,但是插入的结果是一个“空”(不是null)enum类型对于php等弱语言类型的支持很差,弱语言类型打引号和不打引号的值可能是同一类型,但是对于mysql中enum类型的字段来说,那就不一定是一回事了。1.超级不推荐在mysql中设置某一字段类型为enum,但是存的值为数字,比如‘0’,‘1’,‘2’;UNUSED(0,"没用过"),.. https://blog.csdn.net/m0_71777195/article/details/125928071

2、对于MySQL 8.0.15之前的版本,不支持CHECK约束

3、如果一定要在MySQL服务端校验,可使用 trigger 触发器

为何要给数据库字段键约束?在后台代码层面解决啊。

直接用命令方便
create table gender(id int primary key auto_increment,name varchar(20),sex varchar(2),
check(sex='男' or sex='女' or sex='秘密'));

MySQL 所有的存储引擎都不支持 CHECK 约束,MySQL中可以写 CHECK 约束,但会忽略它的作用,因此 CHECK 并不起作用。