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

一、定义

  • 主键:是确定数据中每一条记录的唯一标识,不能重复,不允许有空值(比如居民信息表中的身份证号)
  • 外键:是用来和其他表建立联系,如果一张表中的某个字段指向另外一张表的主键,那么将该字段称之为外键。每张表中,可以有多个外键。

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

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

三、join和外键的关系

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

四、对子表的约束

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


![course.png](https://upload-images.jianshu.io/upload_images/13185380-2bd944f19e0eba31.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
student.png
student item1.png

student item2.png

对子表进行操作时(插入或者修改),如果对应的外键字段在父表找不到对应的匹配,操作就会失败
cmd1.png

因为cno=308在父表中不存在,所以操作失败;
而cno=306的操作成功。

五、对父表的约束

对父表的约束分为三种:

  • 1.district:严格模式(默认),父表不能删除或更新一个已经被子表数据引用的记录;
  • 2.cascade:级联模式,父表的操作(删除或更新),对应子表关联的数据也跟着被删除;
  • 3.set null:置空模式,父表的操作之后,子表对应的数据(外键字段)被置空。
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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容