参考:https://blog.csdn.net/w_linux/article/details/79655073
1、什么是约束
约束就是表中数据的限制条件
2、约束作用
表在设计的时候加入约束的目的就是为了保证表中的记录的完整和有效。
比如name字段中要让其用户名不重复,这就需要添加约束,
3、约束的种类
非空约束(not null)
唯一性约束(unique)
主键约束(primary key) PK
外键约束(foreign key) FK
检查约束(目前Mysql不支持,Oracle支持)
实验:
非空约束:
用not null约束的字段不能为null值,必须给定具体的数据
创建表,给字段添加非空约束
可以插入数据的时候如果name不给值就会报错。 这就是非空约束。
唯一性约束:
unique 约束的字段,具有唯一性,不可重复,但可以为null
插入第二条的时候,email重复了,违反了唯一性约束,直接报错。
上图显示的是表级约束,如果只约束一个字段,表级约束和列级约束是一样的。
表级约束可以联合约束多个字段。表级约束可以给约束起名字,方便以后删除。
使用表级约束联合约束多个字段:
可以看到插入的第二条和第三条冲突了。
主键约束:
表设计时一定要有主键。 原因:https://blog.csdn.net/alexshi5/article/details/81814772
主键约束、主键字段、主键值
表中的某个字段添加主键约束后,该字段为主键字段,主键字段中出现的每一个数据都称为主键值
主键约束与 not null unique 的区别
给某个字段添加主键约束之后,该字段不能重复也不能为空,效果和 "not null unique" 约束相同,但是本质不同。
主键约束除了可以做到 "not null unique" 之外,还会默认添加索引 index
一张表应该有主键字段,如果没有,表示该表无效, 在mysql中,如果没有设置主键,mysql会添加默认主键
主键值:是当前行数据的唯一标识,是当前行数据的身份证号
即使表中两行记录相关数据相同,但由于主键值不同,所以也认为是两行不同的记录。
无论是单一主键还是复合主键,一张表的主键约束只能有一个(约束只能有一个,但可以作用到好几个字段)
单一主键:给一个字段添加主键约束
复合主键:给多个字段联合添加一个主键约束(只能用表级定义)
创建复合主键的表:
在mysql数据库提供了一个自增数字,专门用来自动生成主键值,主键值不用用户维护,自动生成,自增数从1开始,以1递增(auto_increment)
创建自增主键表,并插入两行数据:
外键约束:
只能是表级定义
例子:foreign key (classno) reference t_class(cno)
什么是外键:
若有两个表A、B,id是A的主键,而B中也有id字段,则id就是表B的外键,外键约束主要用来维护两个表之间数据的一致性。
A为基本表,B为信息表。
某个字段添加外键约束之后,该字段称为外键字段,外键字段中每个数据都是外键值。
单一外键:给一个字段添加外键约束
复合外键:给多个字段联合添加一个外键约束
一张表可以由多个外键字段
场景:
设计数据库表,用来存储学生和班级信息
方案1:将学生信息和班级信息存储到一张表,这样数据会有冗余
方案2:将学生信息和班级信息分开两张表存储
为了保证学生表中的classno字段中的数据必须来自于班级表中的cno字段中的数据,有必要给学生表中的classno字段添加外键约束
注意点:
外键值可以为null
外键字段去引用一张表的某个字段的时候,被引用的字段必须具有unique约束
有了外键引用之后,表分为父表和子表
班级表:父表
学生表:子表
创建先创建父表
删除先删除子表数据
插入先插入父表数据
创建表,存储学生班级信息:
班级表:
学生表:
找出每个学生的班级名称: