• 沒有找到結果。

表之间的关系

在数据库应用中,常将不同用途、不同使用频率的数据存放在多个表中,作某项处理时 有可能需要同时访问两个或两个以上的表。为此,引入工作区的概念。

为了保证数据访问的完整性和一致性,需要将有联系的多张表组织到一个数据库中,并 为它们之间建立联系。数据库中的每张表既相互独立,又存在联系。本节介绍了为数据库表 建立关系的方法。

3.6.1 工作区 1.工作区的概念

所谓工作区就是用来存放表的内存空间。每个工作区,在任何时候只能打开一个表,如 果工作区中已经打开了一个表,则在该工作区中再打开另一个工作表时先打开的表将被自动 关闭。在 Visual FoxPro 中最多允许设置 32767 个工作区。

每个工作区有一个编号,对于前 10 个工作区,可以用 A~J 表示,也可以用 1~32767 数字表示。在工作区中打开的表都有一个别名,别名可以用 ALIAS 指定,通过编号和别名 都可以访问相应的工作区。

102 Visual FoxPro 程序设计(第二版)

格式:USE [<数据库名!>]<表名> IN <工作区>

说明:

格式:USE [<数据库名!>]<表名> ALIAS <别名>

说明:表的别名主要用于选择工作区。如未用 ALIAS 指定别名,则在工作区中打开的

格式:SELECT <工作区号>|<别名>

【例 3.32】选择工作区。

CLOSE DATABASE

(4)访问工作区。在任一时刻,用户只能在一个工作区里进行工作,但可以对其他工 作区的表进行访问。各工作区中的文件记录指针是相互独立的,转换工作区时不影响指针位 置,对现行工作区进行与其他工作区无关的操作时,其他工作区的记录指针也不受影响。

为了不至于混淆不同工作区中表的字段内容,Visual FoxPro 规定:从当前工作区对其他 工作区中打开的表进行访问时,必须在被访问的表字段前面加上该表所在的工作区号或表别 LOCA FOR xh="199921614".AND.xm="张" &&记录指针条件定位

DISP

SELE C &&选择 3 号工作区

USE xscj ALIAS cj &&在 3 号当前工作区打开课程设置表 xscj,别名为 cj LOCA FOR cj=90 &&记录指针定位

DISP

CLOSE DATABASE 3.6.2 表间的几种关系

表与表之间存在以下几种关系:

(1)一对一关系。一个表的一条记录对应另一个表的一条记录。如 A 表中的一条记录 在 B 表中有一条记录与之对应;反过来,B 表中的一条记录在 A 表中仅有一条记录与之对 应。具有这种关系的两张表存在一对一的关系。

(2)一对多关系。一个表的一条记录对应另一个表的多条记录。如 A 表中的一条记录 在 B 表中有多条记录与之对应;反过来,B 表中的一条记录在 A 表中仅有一条记录与之对 应。具有这种关系的两张表存在一对多的关系。

(3)多对多关系。一个表的多条记录对应另一个表的多条记录。如 A 表中的一条记录 在 B 表中有多条记录与之对应;反过来,B 表中的一条记录在 A 表中也有多条记录与之对 应。但是 A 表和 B 表之间的这种多对多关系必须通过中间表 C 来连接方可实现。

表之间可通过两表相同的关键码来建立联系,表间关系通过界面和命令两种方式建立。

表之间可建立永久关系,也可建立临时关系,但仅有数据库表可建立永久关系。在建立表之 间的关系时,被关联的表为从表(或称子表),发起关联的表为主表(或称父表)。

1.永久关系 详见 3.2.3 节。

2.临时关系

由于永久关系并不控制各表内记录指针间的关系,因此,在数据库应用中可能既要使用 永久关系,又要使用临时关系。

在数据环境中创建临时关系的方法如下:

方法 1:若要临时关联表,可在“窗口”菜单中选择“数据工作期”命令,出现“数据 工作期”窗口,然后单击“数据工作期”窗口中的“打开”按钮,打开相关的表,最后单击

“关系”按钮,建立表之间的临时关系,如图 3-42 所示。

图 3-42 “数据工作期”窗口显示的临时关系

104 Visual FoxPro 程序设计(第二版)

注意

“数据工作期”就是表单、表单集或报表当前所使用的动态工作环 境,它包含一组工作区,在每一个工作区里都有被打开的表、索引或关 系,使用“数据工作期”可以打开或显示表或视图、建立临时关系、设置 工作区属性。

方法 2:在用表单设计界面时,可在表单中加入数据环境对象。在数据环境中可视化地 建立临时关系。首先,向数据环境中加入有关的数据库表或自由表,然后,在数据环境中建 立表之间的临时关系,如图 3-43 所示。建立临时关系的方法除了可使用上述所讲的建立永 久关系的方法外,还可以在主表的字段与子表的主控索引之间建立。

图 3-43 “数据环境设计器”窗口显示的临时关系

表单启动时,数据环境中的临时关系被建立。表单释放时,数据环境中的临时关系 被撤销。

3.用命令创建临时关系

不同工作区中的表记录指针相互独立,从当前工作区只能访问其他工作区表的当前记 录。例如,为了显示梅诗冬的学号、姓名、课程名称和成绩,做法是分别在 3 个工作区打开 3 个表,并让各自的指针定位在梅诗冬的记录上,然后显示各有关字段。为了使被访问工作 区表的记录指针按一定要求跟着移动,就需要在访问工作区和被访问工作区的两表间建立临 时关系,也称关联。建立临时关系的本质是实现访问工作区与被访问工作区中表的记录指针 的互动,这时,当前工作区中的表称为“主动表”,被访问工作区中的表称为“被关联表”。

格式:SET RELATION TO [<索引关键字> INTO <工作区>|<表别名> [ADDITIVE]]

说明:

(1)<工作区>|<表别名>:被关联的对象,使用本命令之前主动表和被关联表都必须先 行打开。

(2)<索引关键字>:关键字为两表共有的字段,在被关联表中,该字段必须被索引且 索引文件已打开。用这种方式建立关联时,系统根据当前表的这个字段内容,到被关联表中 进行查找,如果找到与公共字段内容相同的记录,则匹配成功,指针指向该记录,否则继续 查找,直到 EOF()为真。

(3)在当前表中,以字段表达式与 INTO 指定的工作区中的主控索引建立关联。

(4)当前表可以与其他工作区的多个表建立关联,此时应使用 ADDITIVE 选项。

【例 3.34】建立临时关系。

CLOSE ALL CLEAR

SELE B &&选择 2 号工作区

USE xscj &&在 2 号工作区打开学生成绩表 xscj INDEX ON xh TAG 学号 &&设置学号索引标识为主控索引 SELE C &&选择 3 号工作区

USE xsda ALIAS da &&在 3 号当前工作区打开课程设置表 xsda,别名为 da SET RELATION TO xh INTO B &&按课程代码 xh 与表 xscj 建立联系

LIST NEXT 10 FIEL xh,xm,da.bj,b.cj &&列表显示 CLOSE ALL

运行结果:

4.解除临时关系

格式:SET RELATION TO

说明:使用此命令前先要进入建立关联时主表所在的工作区。另外,在关闭数据库和关 闭表时表间临时关系也同时被解除。

相關文件