刚刚学习的时候,主键和外键弄不懂,现在终于弄懂了。
一、什么是主键、外键:
关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键
比如
学生表(学号,姓名,性别,班级)
姓名,性别,班级都可以重复,而学号是不会重复的,所以每个学生的学号是唯一的,学号就是一个主键
课程表(课程编号,课程名,学分)
其中课程编号是唯一的,课程编号就是一个主键
成绩表(学号,课程号,成绩)
成绩表中单一一个属性无法唯一标识一条记录,只知道学号,无法确定是哪门课的成绩,只知道课程号,不知道学号,无法确定是哪个学生的成绩,所以 学号和课程号的属性组是一个主键
成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键
同理 成绩表中的课程号是课程表的外键
这个时候,我们新建三张表,名为student,course,grade.
如上图所示,这时,student中的id和course中的cid,都为主键,且都为grade的外键
表中的数据如下所示
student表
course表
grade表
|
主键 |
外键 |
|
定义: |
唯一标识一条记录,不能有重复的,不允许为空 |
表的外键是另一表的主键, 外键可以有重复的, 可以是空值 |
|
作用: |
用来保证数据完整性 |
用来和其他表建立联系用的 |
|
个数: |
主键只能有一个 |
一个表可以有多个外键 |
这个时候,我们就理解了为什么外键可以有重复的了!!!
添加外键的MySQL语句为
alter table grade add CONSTRAINT FK_ID foreign key(id) REFERENCES student(id);
alter table grade add CONSTRAINT FK_ID1 foreign key(cid) REFERENCES course(cid);
删除外键的MYSQL语句为
alter table grade drop foreign key FK_ID;
alter table grade drop foreign key FK_ID1;
外键的删除问题
我们已知外键删除的时候,有四种参数
分别是 cascade,set null,no action,restrict
参数名称 | 功能描述 |
cascade | 删除包含与已删除键值有参照关系的所有记录 |
set null | 修改包含与已删除键值有参照关系的所有记录,使用null值代替,但是无法修改nut null值的数 |
no action | 不进行任何操作 |
restrict | 拒绝主表删除或修改外键关联列 |
首先我们将student的id 作为 grade的外键,course不做处理