数据库应用技术:Visual FoxPro 6.0
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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 命令可以检查当前数据库的完整性。