mysql基础--约束
mysql基础--约束
用于确保数据库的数据满足特定的商户规则,mysql中的约束有(not null 、 unique、 primary key、foreign key、check)
-
primary key:主键
用于唯一的标示表行的数据,定义主键约束后,该列不能重复
- 不能重复而且不能为null
- 一张表只能有一个主键,但可以是复核主键使用下面方式,也就是用两个字段值合并当成一个组合主键
- 在表定义最后写 primary key (字段名,字段名)
- 指定方式又两种
- 直接在创建字段后面指定:字段名 primary key
- 在表定义最后写 primary key (字段名)
- 使用desc 表名,可以看到primary key的情况
- 往往实际开发中,每个表都会具有一个主键
-
not null:非空
必须有数据,不能为null值
-
unique:唯一
本列不能出现重复值
细节:
- 如果被指定的字段,没有另外指定not null,则unique字段可以有多个null;如果一个字段是 unique not null 使用效果类似primary key
- 一张表可以有多个unique字段
-
foreign key:外键
用于定义主表和从表之间的关系:外键约束要定义在从表上,主表则必须具有主键约束或者是unique约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为null,同时当主表中数据已经被外键关联后不能单独去删除主表数据,必须在外键中关联的数据删除后才可以删除主表的关联数据
-- 外键演示 -- 创建主表 create table my_class( id int primary key, -- 班级编号 `name` varchar(32) not null default '' ); -- 创建从表 create table my_stu( id int primary key,-- 学生编号 `name` varchar(32) not null default '' class_id int,-- 学生所在班级编号 -- 下面指定外键 foreign key (class_id) references my_class(id) ); -- 测试代码 insert into my_class values(100, 'java'), (200, 'web');-- 新增班级 insert into my_stu values(1, 'tom', 100);-- 新增学生 insert into my_stu values(2, 'jack', 200);-- 新增学生 insert into my_stu values(3, 'milan', 300);-- 新增学生,失败,因为外键约束,没有300这个键的班级
- 外键指向的表的字段,要求是primary key 或者有unique约束
- 表的类型是innodb,这样的表才支持外键
- 外键字段的类型要和主键字段的类型一致,长度可以不同
- 外键字段的值必须在主键出现过,或则为null(前提时外键字段允许为null)
- 一旦建立主外键的关系,数据不能随意删除了
-
check:检查
用于强制性数据必须满足条件检查,假定sal列上定义了check,并要求sal列值在1000-2000之间,如果插入的值不满足就会提示出错
注意:oracle 和sql server 均支持check,但是mysql5.7目前还不支持check,只做语法检查,但不会生效;mysql中实现check,一般是在程序中控制,或者通过触发器完成
create table test( id int primary key, `name` varchar(32), sex varchar(6) check (sex in ('man','woman')), sal double check (sal > 1000 and sal <2000) )
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南