主外键和外键约束

1,454 阅读3分钟

主外键和外键约束

主键

主键(primary key):一列(或一组列),其值能够唯一区分表中每个行 。

外键

外键(foreign key) 外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系

什么是外键约束

右边的DepartmentID是外键。 外键约束是指用于在两个表之间建立关系,需要指定引用主表的哪一列。

On Delete

On Delete可能取值如上图为:No Action, Cascade,Set Null, Restrict属性。

  1. No Action / Restrict 当取值为No Action或者Restrict时,则当在父表(主表)(即外键的来源表)中删除对应记录时,首先检查该记录对应的从表是否有对应外键,如果有则不允许删除
  2. Cascade(级联) 当取值为Cascade时,则当在父表(主表)(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则也删除外键在子表(即包含外键的表)中的记录。(一起删除
  3. Set Null 当取值为Set Null时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)。

On Update

On Update可能取值如上图为:No Action, Cascade,Set Null, Restrict属性。(更新的是外键的值

  1. No Action / Restrict 当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许更新
  2. Cascade(级联) 当取值为Cascade时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则也更新外键在子表(即包含外键的表)中的记录。
  3. Set Null 当取值为Set Null时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)。

理解示例

表结构

学生表(学号,姓名,性别,班级)  //  学号唯一,能确定学生表的一行
课程表(课程编号,课程名,学分)   //  课程编号唯一,能确定课程表的一行
成绩表(学号,课程号,成绩)     //   学号和课程号才能唯一确定哪个人哪门课得了多少分,学号和课程号这两列为主键

具体分析

以上面的成绩表为例,学号和课程号是成绩表的主键,那么学号是成绩表的外键还是学生表的外键?当然是成绩表的外键,因为学号是学生表的主键呀,怎么可能是外键?同理成绩表课程号也应该是成绩表的外键。 其实,外键主要建立与其他表的联系,如果我们想知道成绩表中某一行成绩是谁考的,啥性别,在哪个班级,就可通过成绩表的外键学号与学生表建立一种关系。