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);
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 并不起作用。