目录
1.域
2.笛卡儿积
3.关系
主码
外码
想要明白主码和外码的概念前,需要先对域和笛卡儿积概念有一个彻底的理解。请阅读的童靴务必耐心~O(∩_∩)O
定义:域是一组 具有相同数据类型值的 集合。(域就是集合,不过集合里的元素是相同的数据类型)
例如,自然数、整数、实数、大于一小于一百的数、{男,女}都可以是域。
笛卡儿积是 域上 的一种集合运算。
定义:给定一组域D1,D2,D3···,Dn,允许其中某些域是相同的,D1,D2,D3,···,Dn的笛卡儿积定义为
D1×D2×D3×···×Dn={(d1,d2,d3,···,dn) | di∈Di ,i=1,2,···,n}
大白话就是从每个域中抽出一个元素放在一起,每一个(d1,d2,d3,···,dn) 称之为一个元组。
这样说还是比较抽象,举一个例子:
定义: D1×D2×D3×···×Dn 的子集叫做在域D1,D2,D3,···,Dn上的 关系,表示为 R(D1,D2,D3,···,Dn)。
(笛卡儿积中若干个元组的集合就是关系)
若关系中的某一个属性组的值能唯一地标识一个元组,而其子集则不能,则称该属性组为候选码(candidate key)。
若一个关系中有多个候选码,则选定其中一个为主码。例如学生的学号就可以作为一个主码,因为它是唯一的。
一个关系可以没有主码,但是设置一个主码的话对数据库查询效率会高一些。
主码不一定是只有一个属性,主码可以由一个或者多个属性组成。主码是候选码之一。
考虑主码的时候考虑的是属性的唯一性,即该属性的值不会重复,如果重复了就无法唯一标识整个元组。
主码的要求是:非空、唯一性。
而设置某个属性:非空仅仅是不允许输入空值,但却可以重复。
那么什么是外码呢?
如果一个关系中的一个属性(该属性不能是候选码)是另外一个关系中的主码则这个属性为外码。
外码的值要么为空,要么要为其对应的主码中的一个值。
保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。
使两张表形成关联,外键只能引用外表中的列的值或使用空值。
阻止执行(情况一):
1、从表插入新行,其外键值不是主表的主键值便阻止插入;
2、从表修改外键值,新值不是主表的主键值便阻止修改;
3、主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);
4、主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。
级联执行(情况二):
1、主表删除行,连带从表的相关行一起删除;
2、主表修改主键值,连带从表相关行的外键值一起修改。
两种方法提供给用户选择。无论选取哪种方法,从表里都不会有多余行。
从另一个角度理解,用拒绝同一事物在从表中的标志与主表不一致。