一、定义
- 主键:是确定数据中每一条记录的唯一标识,不能重复,不允许有空值(比如居民信息表中的身份证号)
- 外键:是用来和其他表建立联系,如果一张表中的某个字段指向另外一张表的主键,那么将该字段称之为外键。每张表中,可以有多个外键。
二、一张表的外键可以是这张表的主键吗?
可以,但是由于主键不能重复,所以只有在联合主键的情况下,这个外键才可以重复。
三、join和外键的关系
相同:都是用于建立两个表之间的关系
不同:外键的参考字段必须是另一张表的主键;外键是一种约束关系,会分别对子表和父表进行约束(父表:外键指向的表,子表:拥有外键的表)
四、对子表的约束
首先创建两个表,分别为student 和course,可以看到course表中cno是主键;student表中id是主键,cno指向course的主键,因此我建立了一个外键,名叫fk_student_course。
对子表进行操作时(插入或者修改),如果对应的外键字段在父表找不到对应的匹配,操作就会失败
因为cno=308在父表中不存在,所以操作失败;
而cno=306的操作成功。
五、对父表的约束
对父表的约束分为三种:
- 1.district:严格模式(默认),父表不能删除或更新一个已经被子表数据引用的记录;
- 2.cascade:级联模式,父表的操作(删除或更新),对应子表关联的数据也跟着被删除;
- 3.set null:置空模式,父表的操作之后,子表对应的数据(外键字段)被置空。
5.1 district模式
由于cno=307在子表中被引用,所以执行父表的删除操作失败。
5.2 cascade模式
先将外键删除,再建立一个新的外键,名字为fk2(只要在语句后面添加on delete + 模式 + on update + 模式即可)
对父表执行删除操作时,可以看到student表中cno=307的记录也被删除。
对父表执行更新操作时,可以看到student表中cno=306的记录也被更改为cno=309。
5.3 set null模式
可以看到当父表中cno=302的记录被删除时,子表中对应的cno被置空。