前言
说到外键,一般就会牵扯出约束。不谈约束,起始外键就是一个普通的字段(Column),起到一个关联的作用。
先把约束放一边,看看外键有哪些作用。
建立表中记录的一对一的关系
学生表:
手机表:
学生有一个字段是手机id,而手机存在多个属性,那现在把手机单独建一张表。
这样如果那天想查所有手机号时,直接查这张表效率更高。此时的PhoneId就是学生表的外键。而且是手机表的主键。
这里的一个特点,一个表的外键,在另一个表中,必须为主键。所以外键通常就一个ID。这个ID关联起两张表。如果是一对一,做表联结也非常简单。
一对多(多对一)的关系
假设这个学校有三个学生,两个老师,每个学生只能选择一个老师
学生表:
老师表:
可以看到,学生12选择导师Song,这就是多个学生选择一个老师, 这个和一对一几乎没啥变化。也就是告诉你外键本身是可以重复的。
这样,又发现一个好处,多对一的情况下,相比建一个表,通过外键建两张表更节省空间。
多对多的关系
但是,如果学生可以选择多个老师,老师也可以拥有多个学生呢?
这就是多对多。
学生表:
教师表:
外键表:
发现多对对的情况下,学生表和教师表,都不存在外键。外键存在于另外一张中间表,称之为外键表(当然这张表也有主键,这里为了关注重点,省略了)
通过这个外键表,可以清晰的看出,学生1拥有两个老师(2,3),学生3有三个老师(1,2,3)
而老师2,有两个学生(1,3),老师3有两个学生(3,1)
约束
更能体现外键作用的是约束,约束其实是定义好的规则,简化对数据库操作。就是某些操作在定义好的约束后,自动完成!这就是定义外键的另一好处。
约束分为删除和更新。删除用的较多。
删除约束
学生表:
手机表:
拿一对一的举例,通常将拥有外键的表称为子表,这里学生表就是子表,手机表就是学生表的主表。 删除约束,就是当主表中的某条记录被删除时,子表中对应的记录如何处理?
方式1:当主表中的某条记录被删除时,对应的子表中的记录中的外键自动置为Null。
方式2:当主表中的某条记录被删除时,对应的子表中的元素自动也删除。
方式3:当主表中的某条记录被删除时,如果子表有记录关联到该主表记录,此时无法删除主表中的这条记录,会报错。
更新约束
这个情况发生较少,就是当手机表中的PhoneId发生更改时,学生表中的PhoneId也会随之自动变化。