(首先理解弄透实体完整性,实体完整性规则是最好理解的,再来理解参照完整性就不难了)
2.参照完整性
现实世界中的实体之间往往存在某种联系,在关系模型中实体及实体间的联系都是用关系来描述的,这样就自然存在着关系与关系间的引用。
定义:设F是基本关系的一个或一组属性,但不是关系R的码(如果某张表多个属性作为主码,那么这里的主码不能理解为单个主属性,这也是码和主属性的区别),Ks是基本关系S的主码。如果F与Ks相对应,则称F是R的外码,并称基本关系R为参照关系,基本关系S为被参照关系或目标关系。关系和R和S不一定是不同的关系。
2.1 一对多关系的理解
学生实体和专业实体用下面关系表示:
学生(学号,姓名,性别,专业号,年龄)
(Sno,Sname,Ssex,Smajor,Sage)
专业 (专业号,专业名)
(Major,Mname)
(黑体加下划线的属性为主码)
- 这两个关系之间存在着属性的引用,及学生关系引用了专业关系的主码“专业号”。显然这个“专业号”必须是确实存在的专业号,打个比方,学校现在只开了计算机,政治,数学,
专业
专业号 | 专业名 |
001 | 计算机 |
002 | 政治 |
003 | 数学 |
我总不可能添加一个学生是小偷专业的吧!!!所以这也是为什么参照完整性规则是对多个关系(关系可以理解为实体或关系,实体或关系可以理解为一张表,也就是多张表,不懂可以翻阅上篇博客)的约束 ,所以现在我每在学生表添加一个学生都要参照专业表。
回到定义,设F是基本关系的一个或一组属性,(这里的F可以指学生表专业号),但不是关系R(这里指学生表)的码,Ks(专业表专业号)是基本关系S(专业表)的主码,如果F(学生表中的专业号)与Ks(专业表专业号)相对应,则称F是R的外码,并称基本关系R为参照关系,基本关系S为被参照关系。关系R和S不一定是不同关系(这句话可以忽略,影响现阶段的理解)。
有了上面的定义与对照的关系表示可以弄懂
学生表中红字专业号为外码,基本关系R(学生表)为参照关系,基本关系S为被参照关系。
所以当你设置学生表中的专业号为外码 (前提是已经创建专业表ZMajor,实体完整性不用我多说吧,顺序不能弄反)
CREATE TABLE Student
( Sno CHAR(9),
Sname CHAR(4),
Ssex CHAR(2),
Smajor CHAR(9),
Sage SMALLINT,
PRIMARY KEY(Sno),/*这里定义了实体完整性,Sno不能取空值,参照上一篇博客*/
FOREIGN KEY(Smajor) REFERENCES ZMajor(Major)/*定义了参照完整性,学生表专业号引用专业表专业号*/
ON DELETE CASCADE /*当删除ZMajor表中的某个专业的时候,比如学校取消了某个专业,级联删除这个专业的所有学生
当然,如果你正在学计算机,学校如果取消计算机专业,你的信息(学生表)也会进行级联删除
所以一般学校等你们毕业了,计算机专业不招人了也没有人了,学校再来取消这个专业,所以这个 级联删除不是很常见。毕竟是贴近现实世界,大学取消某个专业*/
ON UPDATE CASCADE /*理解了上面的注释话,这个就好理解了,当更新ZMajor表中某个专业信息,比如你们校长疯了,计算机专 业全部取搬砖专业,所以你们所有计算机专业的学生专业号001-计算机,统一是001-搬砖,其实学生表中001并没有改变,但是当查询到你的时候,比如连接查询,嘿嘿,那你就是搬砖专业*/
级联操作只是参照完整性被破坏时采取策略的一种,默认策略为NO ACTION(拒绝执行),有了上面的理解基础,不难理解当INSERT插入学生表中数据,你加了一个不存在的专业号,这就就是为上面数据库就会拒绝执行。查询的话不改变数据库中的原则。参照完整性被规则破坏一般是被参照表中(例子中的专业表)的内容被修改,破坏时的操作均写在参照表的定义中。
以上部分时一对多的关系,如果有需要的话私我,我可以继续更新多对多参照完整性。