关于主键和外键的一些疑问和解答

2018-08-17  本文已影响0人  未抵达catty

一、定义

二、一张表的外键可以是这张表的主键吗?

可以,但是由于主键不能重复,所以只有在联合主键的情况下,这个外键才可以重复。

三、join和外键的关系

相同:都是用于建立两个表之间的关系
不同:外键的参考字段必须是另一张表的主键;外键是一种约束关系,会分别对子表和父表进行约束(父表:外键指向的表,子表:拥有外键的表)

四、对子表的约束

首先创建两个表,分别为student 和course,可以看到course表中cno是主键;student表中id是主键,cno指向course的主键,因此我建立了一个外键,名叫fk_student_course。


![course.png](https://img.haomeiwen.com/i13185380/2bd944f19e0eba31.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) student.png student item1.png student item2.png
对子表进行操作时(插入或者修改),如果对应的外键字段在父表找不到对应的匹配,操作就会失败
cmd1.png
因为cno=308在父表中不存在,所以操作失败;
而cno=306的操作成功。

五、对父表的约束

对父表的约束分为三种:

5.1 district模式

由于cno=307在子表中被引用,所以执行父表的删除操作失败。


cmd2.png
5.2 cascade模式

先将外键删除,再建立一个新的外键,名字为fk2(只要在语句后面添加on delete + 模式 + on update + 模式即可)


cmd3.png fk2.png

对父表执行删除操作时,可以看到student表中cno=307的记录也被删除。

cmd4.png

对父表执行更新操作时,可以看到student表中cno=306的记录也被更改为cno=309。


cmd5.png
5.3 set null模式
fk3.png

可以看到当父表中cno=302的记录被删除时,子表中对应的cno被置空。


cmd6.png
上一篇 下一篇

猜你喜欢

热点阅读