2.8 创建表间关系
在数据库系统中,如何方便、高效地进行数据处理、减少数据的冗余度是一个很重要的问题。根据关系数据库的理论,每个独立的表中存储的数据之间都有关系。用户根据需要可以建立数据之间的关系,Visual FoxPro利用这些关系来查找数据库中有联系的信息。表之间的关系可以分为一对一、一对多和多对多3种关系。
2.8.1 表间关系
1.一对一关系
一对一关系是指在表A中的任何一条记录,在表B中只能对应一条记录,而表B中的一条记录在表A中也只能有一条记录与之对应。例如“学籍”表和“成绩”表,一个学生在一个表中只能出现一次,则这两个表之间可以建立一对一的关系。具有一对一关系的两个表可以合并成一个表。
在Visual FoxPro 6.0中,表之间的连接关系是通过索引来创建的,在一对一的关系中,两个表必须有一个相同的索引作为主关键字段,通过这个主关键字索引来建立关系。
2.一对多关系
一对多关系是指表A中的一条记录可以对应表B中的多条记录,而表B中的一条记录最多只能对应表A的一条记录。一对多关系在关系数据库中是最普遍的关系。
建立一对多的关系时,“一”方(父表)使用主关键字或候选索引关键字,而“多”方(子表)使用普通索引关键字。例如“学籍”表和“图书借阅”表,一个学生可以借阅多本图书,但一个学生在“学籍”表中只有一条记录,而在“图书借阅”表中可以有多条记录,则“学籍”表和“图书借阅”表之间便是一对多的连接关系。
3.多对多关系
多对多关系是指表A中的一条记录可以对应表B中的多条记录,而表B中的一条记录也可以对应表A中的多条记录。
例如,在学生和课程之间的关系中,一个学生学习多门课程,而每门课程也由多个学生来学习。通常在处理多对多的关系时,都把多对多的关系分成两个不同的一对多的关系,这时需要创建第3个表,即通过一个中间表来建立两者的对应关系。用户可以把两个表中的主关键字都放在这个中间表中。
2.8.2 设置表间临时关系
在建立表间的临时关系后,使得“多”方中的记录指针随着“一”方记录指针的移动而移动。
在Visual FoxPro 6.0中可以使用“数据工作期”窗口或使用SET RELATION命令建立两个表之间的临时关系。
使用“数据工作期”窗口建立两个表间关系的操作步骤如下:
(1)打开“数据工作期”窗口,如图2-48所示。先打开“学籍”表(A工作区),再打开“成绩”表(B工作区)。
(2)在“别名”列表中选择要关联的表,如“学籍”表,然后单击“关系”按钮,此时在“关系”列表中添加一个“学籍”表(如图2-48所示)。
(3)在“别名”列表中选择“成绩”表,此时打开“设置索引顺序”对话框,如图2-49所示,可以设置表的索引顺序。
(4)单击“确定”按钮,打开“表达式生成器”对话框,在“字段”列表中双击“学号”字段,将其添加到“SET RELATION”列表框中,再单击“确定”按钮,返回到“数据工作期”窗口,则建立了两表的关联,如图2-50所示。
在命令窗口键入命令:
BROWSE FIELDS 姓名,专业,成绩->姓名,B.总分
图2-48 建立表间关系
图2-49 “设置索引顺序”对话框
图2-50 建立两表的关联
在浏览窗口中可以观察到两个表中记录的关联。
使用SET RELATION 命令建立两个表之间的关系时,要求两个表都具有相同的字段,且建立主索引,分别在两个工作区打开。
例如,使用SET RELATION命令建立“学籍”表和“成绩”表的关联,可键入命令:
OPEN DATABASE 学生 USE 学籍.dbf USE 成绩.dbf IN 0 &&已按“学号”建立索引 SELECT 2 SET ORDER TO 1 SELECT 1 SET RELATION TO 学号 INTO 成绩 &&对“学籍”表和“成绩”表按“学号”字段建立关联
数据库关闭时,所建立的关系被取消。
2.8.3 建立表间永久关系
数据表之间的永久关系存储在数据库文件中,而不同于SET RELATION命令所建立的临时关系,每次使用时需要重新建立。索引关键字的类型决定了要创建的永久关系的类型。在一对多关系中,“一”方必须用主索引关键字,或者用候选索引关键字;而“多”方则使用普通索引关键字。
【例17】将“学籍”表和“图书借阅”表建立一对多的关系。
“一”方“学籍”表已按“学号”字段建立了主索引,而“图书借阅”表已按“学号”字段建立了普通索引,如果这些工作事先没有完成,可在“表设计器”中设置索引。
操作步骤如下:
(1)打开“项目管理器”窗口,选择“学生”数据库,单击“修改”按钮,打开“数据库设计器”窗口。
(2)选择“学籍”表中的主索引“学号”,将其拖到“图书借阅”表中的对应“学号”上。此时,可以看到它们之间出现一条黑线,表示在两个表之间建立了一对多的关系,如图2-51所示。
图2-51 建立的一对多关系
(3)关闭“数据库设计器”窗口。
在“数据库设计器”窗口中,如果各表之间建立了关联,则可以看到它们之间出现一条连线。在连线的两端,分别是“”和“”形状,表示一端是“一”,一端是“多”;如果连线的两端都是“”形状,表示两个表之间的相应字段的是一对一的。
2.8.4 编辑表间关系
在表之间建立关系后,如果要删除已建立的关系或重新建立其他的关系,可以利用Visual FoxPro 6.0提供的快捷菜单进行操作。操作步骤如下:
(1)打开“数据库设计器”窗口,右击表之间的连线,此时弹出快捷菜单,如图2-52所示。
(2)如果要删除已建立的关系,单击快捷菜单中的“删除关系”命令,则连线消失,表示两表之间的关系被删除。选择“编辑关系…”命令,打开“编辑关系”对话框,如图2-53所示。
(3)单击“确定”按钮。
图2-52 编辑表间关系对应的快捷菜单
图2-53 “编辑关系”对话框
2.8.5 编辑参照完整性
在表间建立关系后,可以通过设置参照完整性来建立一些规则,以便控制相关表中记录的插入、更新或删除。实施参照完整性规则,可以确保:
- 当表中没有关联的记录时,记录不得添加到相关表中。
- 父表的值不能改变,若改变将导致相关表出现孤立的记录。
- 若主表记录在相关表中有匹配记录,则该主表记录不能被删除。
下面以“学籍”表和“图书借阅”表之间的关系为例,介绍如何设置参照完整性。
(1)在如图2-52所示的快捷菜单中单击“编辑参照完整性”命令,打开“参照完整性生成器”对话框,如图2-54所示。该对话框列出了数据库中彼此有关联关系的表,并指明父表、子表,以及用以建立关联的索引关键字。
图2-54 “参照完整性生成器”对话框
(2)在“参照完整性生成器”对话框中,有更新规则、删除规则、插入规则3个选项卡。
- “更新规则”选项卡用来设置关联表之间的更新规则,有3种选择,默认为“忽略”,即不进行任何参照完整性的检查工作。
- 例如,“学籍”表与“图书借阅”表之间通过“学号”主关键字建立了关联,若选择了“级联”选项,当更新“学籍”表中“学号”字段值时,关联的“图书借阅”表中对应记录的“学号”字段值自动更新。
- “删除规则”用来设置关联表之间的删除规则,同样有3种选择。
- 如果选择了“限制”选项,当在“学籍”表中要删除学号为“110102”的记录时,因为在“图书借阅”表中存在相对应的记录,则该操作被禁止。
- “插入规则”用来设置关联表之间的插入规则。有“限制”和“忽略”两种选择。
- 如果选择了“忽略”选项,则在“图书借阅”表中添加任何新记录时,即使添加的学号在“学籍”表中找不到对应值,也不会有任何限制。
(3)设置完参照完整性之后,单击“确定”按钮,出现如图2-55所示的确认对话框。
图2-55 确认保存参照完整性对话框
(4)单击“是”按钮,出现确认是否生成新的参照完整性代码对话框,如图2-56所示。
图2-56 确认是否生成新的参照完整性代码对话框
(5)单击“是”按钮,结束设置参照完整性。
建立表间关系后,将根据这些规则自动进行检查和维护关联表,在对数据进行更新、删除和插入时检查和维护父表和子表之间的相互关联。
试一试
1.为“部门”表和“教师”表以“部门编号”为关键字建立一对多关联。
2.为“教师”表和“教师任课”表以“教师编号”为关键字建立一对多关联。
3.设置更新规则为级联、限制或忽略后,更新“部门”表的部门编号字段值,观察更新结果。
4.设置删除和插入为“限制”,对“部门”表进行删除操作、对“教师”表进行插入操作,观察结果。
5.建立“部门”表和“教师”表之间的临时关系,然后实现带关系的多表浏览。
知识链接
数据的一致性和完整性
数据一致性和完整性包括实体完整性、域完整性和参照完整性。
1.实体完整性。它是由关系中的主键来保证的,确保表中记录的唯一性,在一个表中不允许有重复的记录出现。因此,一个表中应该至少有一个关键字。
2.域完整性。域完整性即属性的取值范围。在建立表时定义数据库表的字段数据类型、字段宽度就属于域完整性的范畴。为表中的字段设置有效性规则,也是一种域完整性约束规则。
3.参照完整性。在父表与子表建立关系的基础上,建立参照完整性,包括更新规则、删除规则和插入规则。也就是说,对一个表中的记录,不一定能随意增加、修改和删除,还必须参照其他表中的相关数据才行。
使用VALIDATE DATABASE 命令可以检查当前数据库的完整性。