文章目录
约束 Constraint分类多表关系范式第一范式1NF、第二范式2NF第三范式3NFBCNF约束 Constraint
概念:对表中数据进行限制,保证数据正确性、有效性、完整性。
分类
主键:primary key配合INT
类型主键 可以加auto_increment
插入数据输入null
也可自动增长非空:not null唯一:unique (唯一约束限定可以有多个NULL)外键:foreign key (外键名 和外键列名是两个东西)
# 创建时添加create table 表名(...外键列,consstraint 外键名称 foreign key (外键列名) references 关联表名(主表列名));#删除外键alter table 表名 drop foreign key 外键名;#通过alter增加外键(增加外键之前先增加外键列,不能一起写)alter table 表名 add constraint 外键名称 foreign key (外键列名) references 关联表名(主表列名);#建立级联 添加ON UPDATE CASCADEalter table 表名 add constraint 外键名称 foreign key (外键列名) references 关联表名(主表列名) ON UPDATE CASCADE;# 删除级联 ON DELETE CASCADE
CREATE TABLE student(name VARCHAR(20) NOT NULL,phone_number VARCHAR(20) UNIQUE,id VARCHAR(20) primary key,age intcity VARCHAR(20), #外键constraint city_name foreign key (city) references city(name))
多表关系
一对一 (身份证和人)可以在任意一方增加外键,指向对方主键,并且将外键唯一。或者主键相同一对多 (员工和部门)
多个员工同一个部门n:1
关系, 在n
侧建立外键指向1
侧的主键多对多 (学生和课程)
学生可选多个课程,课程可以有多个学生m:n
关系,增加中间表,至少要包含两个键,例如:stu_id
和class_id
,两个键形成联合主键。通过中间表,表示多对多关系。
范式
第一范式1NF、
每一列都是不可分割的原子数据项。
第二范式2NF
1NF的基础上,非码属性必须完全依赖于候选码,即消除非码属性对主码的部分函数依赖
函数依赖:通过A->B,A属性或属性组可以唯一确定B的值,则B依赖A。
完全函数依赖:A是属性组,B需要通过A中的所有属性决定,则B完全函数依赖A。
部分函数依赖:A是属性组,但是A中的一个属性就可以确定B,则B部分函数依赖于A。
传递函数依赖:A->B,B->C ,则C传递函数依赖于A。
码:一个属性或属性组被去他所有属性完全依赖,则称它为该表的码。
候选码:如果关系中的某一属性组能唯一的标识一个元组,则成该属性组为候选码
主码:如果一个关系有多个候选码,则选其中一个为主码
主属性:候选码的所有属性称为主属性
非主属性:不包含在任何候选码中的属性是非主属性
第三范式3NF
在2NF基础上,任何非主属性不依赖于其他非主属性,消除传递依赖。
例如:
系主任依赖于系名,系名又依赖于学号,产生传递依赖系主任->系名->学号
。拆分后满足第三范式。
BCNF
所有非主属性,对每一个候选码都是完全函数依赖。主属性对不包含它的码,也是完全函数依赖,我理解为主属性之间互相完全函数依赖。没有属性完全依赖于非码的任何一组属性,非主属性之间不能有依赖。例如学号
,学生名
,宿舍
,年龄
:(假设学生名唯一) 宿舍,年龄都完全依赖于 学号和学生名学号和学生名之间完全函数依赖没有属性依赖于宿舍和年龄