《数据库基础与Visual FoxPro9.0程序设计》课件第5章_第1页
《数据库基础与Visual FoxPro9.0程序设计》课件第5章_第2页
《数据库基础与Visual FoxPro9.0程序设计》课件第5章_第3页
《数据库基础与Visual FoxPro9.0程序设计》课件第5章_第4页
《数据库基础与Visual FoxPro9.0程序设计》课件第5章_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章表的索引5.1索引5.2多个表联访练习五5.1索引

把按表达式值进行物理排序生成新表的操作称为表的排序。由于表的排序要生成一个新表,而新表将占据大量的磁盘空间,且造成数据大量冗余,会产生意想不到的插入异常、删除异常、修改异常等潜在危险,与关系型数据库的要求相矛盾,因此目前已极少使用。而数据表的索引正好可以克服这些缺点。5.1.1索引的概念及类型

1.索引的概念

按照某个表达式的值对表进行逻辑排序,称为索引,该表达式称为索引表达式。索引表达式可以是字段名、字段的组合、记录号函数等。

索引并不改变表中记录的物理顺序,仅生成一个索引文件或标记。在索引中,仅有两个字段,即索引表达式值和一个指向表的对应记录的指针。显然,它把数据冗余压缩到了最小程度。也正因为索引仅有两个字段,所以它不能单独使用,必须在表打开后才起作用。表以索引形式打开后,记录将按逻辑次序显示并操作;编辑原表的记录时,所有打开的索引都会自动更新,从而自动保持了表数据与索引文件数据的一致性。

在数据库中,索引可以用来建立数据库表之间的相互永久关联,实现表间的参照完整性,所以索引得到了广泛的使用。

但过多的索引会降低表的更新速度,因此扬长避短,适当地而不是过多地使用索引,达到既可保持数据的一致性,又可提高查询速度,还可避免降低表数据的更新速度,则显得非常重要。

2.索引的分类

索引的类型是指将索引按索引表达式的值是否允许重复及表允许索引的个数而划分的。在VisualFoxPro9.0中有5种类型的索引:主索引、候选索引、二进制索引、普通索引和唯一索引。如果建立索引的表达式是字段,也称之为索引关键字。

1)候选索引(CandidateIndex)

用候选码(CandidateCode)创建的索引称为候选索引。候选索引具有以下特点:

①候选码可唯一地标识表的各条记录。

②不管是库表还是自由表都可以建立候选索引,且一个表允许建立多个候选索引。③在数据库表中,若有多个候选索引,可将其中一个指定为主索引。

④候选索引只能存储于结构复合索引文件中。

2)主索引(PrimaryIndex)

在数据库表中,选中其中的一个候选码作为主码(PrimaryCode)建立的索引称为主索引。主索引的特点如下:

①主索引是多个候选索引中的一个。

②只有数据库表才可以创建主索引。

③每一个库表只允许建立一个主索引。

④自由表无主索引。

⑤和候选索引一样,主索引也只能存储于结构复合索引文件中。

3)普通索引(RegularIndex)

允许索引表达式的值重复的索引称为普通索引。在普通索引中,记录按索引表达式值次序排列,对于索引表达式值相同的记录,则按原记录录入的物理次序排列在一起。普通索引既可存储于复合索引文件中,也可单独以单索引文件的形式出现。

4)二进制索引(BinaryIndex)

二进制索引或位图索引是根据一个有效且非空的逻辑表达式创建的一种索引。例如,标记删除的记录,它支持自由表和库表。但是,二进制索引不支持下列情况:

①使用带有Null值的索引表达式。

②过滤条件含有FOR子句。③改变记录显示和处理次序的关键字,例如ASCENDING、DESCENDING、UNIQUE、CANDIDATE。

④设置二进制索引为主控索引,例如SETORDER命令。

⑤进行排序和索引查找操作。

5)唯一索引(UniqueIndex)

早期的VFP版本有唯一索引。它与普通索引类似,但对于关键表达式的值相同的所有记录,仅将它们其中的第1条记录存入索引文件中,从而可避免显示或访问关键表达式值相同的其它记录。对于添加到表中的记录,如果与表中原有记录的索引关键表达式值相同,则它不会被包含在索引文件中。目前,在VFP9.0下利用表设计器已不能建立唯一索引。

3.索引文件的类型

按索引文件所允许包含的索引个数,将索引文件分为两大类:单索引文件和复合索引文件。

1)单索引文件

所谓单索引文件,是指一个索引文件只允许包含一个索引,且扩展名是“.IDX”的索引文件。单索引文件又称为独立索引文件。

单索引文件主要是为和老版本VFP(或FoxBase)兼容而设置的,它保存临时的或较少使用的单个索引,一般在使用之前才创建或必要时才进行更新。单索引文件的特点是:

①单索引只有升序而无降序。

②只有普通和唯一两种索引。

③打开方法多样,既可以与表同时打开,也可以在表已打开的情况下独立打开。

④存储形式多样,既可以是压缩形式,也可以是非压缩形式。压缩形式的存储量小且访问速度快,但与FoxBase不兼容。

2)复合索引文件

所谓复合索引文件,是指同一个索引文件中可以包含多个索引。复合索引文件的扩展名是“.CDX”,它只以压缩形式存放。根据索引是否属于表结构的一部分,复合索引文件又分为结构复合索引文件和非结构复合索引文件。

所谓结构复合索引文件,是指索引属于表结构的一部分的复合索引文件。

表的主索引和候选索引只能存储在结构复合索引文件中。同时结构复合索引文件也常用于频繁使用和需要经常维护的

索引。

由于结构复合索引是表结构的一部分,因此决定了它“与表同步”的特点——文件主名与表同名;随表创建、打开、关闭、更新、删除而自动创建、打开、关闭、更新和删除。

凡是利用表设计器创建的索引一定是结构复合索引文件的标记。5.1.2创建索引

索引的创建分为菜单方法创建和命令方法创建。

1.菜单方法创建索引

在菜单方式下,通过表设计器只能创建结构复合索引文件的索引标记。根据创建的索引标记是普通索引还是其它索引、创建索引表达式是索引关键字还是表达式,创建的方法略有

不同。

1)用索引关键字创建普通索引标记

使用索引关键字创建普通索引最简单,只要在表设计器的字段对话框即可完成任务。图5.1就是表设计器“字段”对话框。它含有一个索引列表框,专供创建以字段为索引表达式的普通索引。创建的步骤

如下:

S1:用独占方式打开表(如是库表,则先打开数据库再打开表)。

S2:打开表设计器,选定要作为索引关键字的字段。

S3:创建索引。在选定字段后面的索引列表框中选择索引次序,向上的箭头为递增次序,向下的箭头为递减次序。

S4:创建完成。→【确定】。

注意此时创建的索引一定是结构复合索引的一个标记,标记名与该字段同名。图5.1“字段”对话框

例5.1对“xsjbqkb.dbf”根据“出生日期”字段,创建一个降序的普通索引。

USExsjbqkbEXCLUSIVE

MODIFYSTRUCTURE

在表设计器的字段对话框,选定字段“出生日期”,在“索引”列表框中选择“↓降序”,结果如图5.1所示。最后单击

【确定】。

2)创建其它索引

结构复合索引中其它各类型索引的创建要通过表设计的“索引”对话框进行。“索引”对话框如图5.2所示,它所包含的各个列功能如下:●排序(次序):切换按钮,确定排序的次序为升序还是降序,箭头向下为降序,向上为升序。

●索引:指定要生成的索引标记的名称。缺省为与字段同名。

●类型:列表框,指定索引的类型。缺省为普通索引。

●表达式:指定索引表达式,既可在其文本框直接写入,又可用表达式生成器创建。

●筛选:指定要索引的记录的筛选条件,既可在其文本框中直接写入,又可用表达式生成器创建。缺省为所有的记录全部按索引表达式的值进行索引。

●排序:列表框,确定字符排序所使用的方式,该方式有PinYin、Machine和Stroke三种。

创建索引的步骤如下:

S1、S2:与创建单字段普通索引相同。

S3:→“索引”↓索引。

S4:填写或选择有关选项卡,包括排序、索引、类型、表达式、筛选、排序的值或表达式。

S5:→【确定】。图5.2“索引”对话框

例5.2

对“xsjbqkb.dbf”根据“性别”和“出生日期”字段,创建一个降序的候选索引,索引标记为“性别日期”,索引条件为党团关系=‘团员’,然后浏览结果。

S1:创建索引。

S1-1:USExsjbqkbEXCLUSIVE

S1-2:MODIFYSTRUCTURE

S1-3:→“索引”,填写有关选项(如图5.2所示)→【确定】。

S2:打开“工作区属性”对话框。在系统菜单中→“显示”→“浏览”→“表”→“属性”↓工作区属性。

S3:选择索引顺序。在索引顺序列表框中选择:xsjbqkb.性别日期,如图5.3所示,→【确定】←MicrosoftVisualFoxPro。

S4:进行浏览,结果如图5.4所示。

注意:结构复合索引创建后,一般应通过“工作区属性”对话框的“索引顺序”列表框选择索引顺序,方可按照某个索引确定的记录逻辑次序显示表记录。这实际上是选择表的主控索引(亦称当前索引)。图5.3“工作区属性”对话框

图5.4索引后的浏览结果

2.命令方法创建索引

与菜单方式创建索引不同,用命令方式既可创建复合索引,又可创建单索引,命令如下:

【命令格式】

INDEXONExpressionTOIDXFileName|TAGTagName[BINARY]

[COLLATEcCollateSequence][OFCDXFileName]

[FORlExpression]

[COMPACT][ASCENDING|DESCENDING]

[UNIQUE|CANDIDATE][ADDITIVE]

【功能】

该命令用于建立单索引文件或向复合索引文件增加索引

标记。

【参数和子句说明】

● Expression:指定索引表达式。

● TOIDXFileName:指定要建立单索引文件的文件名。

● TAGTagName:指定建立复合索引文件的索引标记,或增加索引标记。

● BINARY:创建二进制索引。

● COLLATEcCollateSequenc:指定字符比较次序。缺省时为机器设置的缺省值。● OFCDXFileName:指定索引标记所隶属的非结构复合索引文件的名称。若缺省则表示创建或在结构复合索引文件中添加新的索引标记。

● FORlExpression:记录的筛选条件。缺省时为全部

记录。

● COMPACT:指定生成一个压缩的单索引文件。缺省表示不压缩。

● ASCENDING|DESCENDING:指定升序或降序索引,仅对复合索引有效。缺省为升序。

● UNIQUE|CANDIDATE:用于指定索引类型。前者表示唯一索引;后者表示候选索引。缺省为普通索引。● ADDITIVE:建立索引的同时不关闭先前已打开的索引。缺省时表示在创建本索引的同时关闭除结构复合索引之外的其它所有索引。

【注意事项】

当索引表达式为多字段时,必须将多个字段组成合理的有效表达式。一般组成字符串表达式。对于数值型字段,需用STR()函数将数值型数据转换成字符串;对于日期型数据,需用DTOC()函数将其转换成字符串,然后将它们用运算符“+”连接起来。

例5.3

利用索引创建命令,重做例5.2。

USExsjbqkbEXCLUSIVE

INDEXON性别+DTOC(出生日期)DESCENDING

TAG性别日期1FOR党团关系=‘团员’

BROWSE

显示结果与图5.4相同,且此时在工作区属性对话框的索引顺序已自动变为了xsjbqkb.性别日期1。可见用最后一次命令方式创建的索引将自动变为主控索引。

例5.4

为xsj

bqkb添加一个“应往届生L”字段,并输入各记录的该字段值的值,然后以该字段为索引关键字创建一个二进制索引标记。

ALTERTABLExsjbqkbADD应往届生L

INDEXon应往届生TAG应往届生BINARY

但二进制索引不能确定为主控索引,因此无法观察索引后的记录次序。5.1.3使用索引

1.打开与关闭索引文件

索引文件的类型不同,打开与关闭的方法也不尽相同。结构复合索引文件始终与表自动同时打开和关闭。单索引和非结构复合索引既可以与表同时打开和关闭,也可以在表文件打开之后单独打开和关闭。

在表文件打开之后打开索引文件的菜单方法与打开其它文件的方法相同,都是通过【打开】按钮进行的,无须赘述。下面介绍用命令方式打开索引文件。

1)索引文件与表同时打开

对于单索引和非结构复合索引,可用在USE命令中加入INDEX子句的方法实现与表文件的同时打开。下面给出USE命令的完整格式。

【命令格式】

USE[[[DatabaseName!]TableName|?][INnWorkArea|cTableAlias]

[INDEXIndexFileList|?[ORDER[nIndexNumber|IDXFileName

|[TAG]TagName[OFCDXFileName]

[ASCENDING|DESCENDING]][ALIAScTableAlias]

[EXCLUSIVE][SHARED][NOUPDATE]]

【功能】

该命令用于在打开表或关闭表的同时打开或关闭索引文件。

【参数和子句说明】

● DatabaseName!:指定要打开表所隶属的数据库名。缺省时指当前库或自由表。

● TableName:指定要打开的表名。

● INnWorkArea|cTableAlias:指定表打开的工作区号或工作区别名。

● INDEXIndexFileList:指明要和表同时打开的非结构复合索引和单索引文件的名称。缺省时指将表按普通方式打开。● ORDER[nIndexNumber|IDXFileName|[TAG]TagName[OFCDXFileName]:指定主控索引。nIndexNumber为索引的编号,IDXFileName为单索引的名字,TagName为结构复合索引的标记名称,CDXFileName为非结构复合索引文件的名称。

● ASCENDING|DESCENDING:指明不管表的索引创建时是升序还是降序,这里都临时以升序或降序显示和操作。缺省时以创建索引时的次序为准。

● ALIAScTableAlias:为表取一个别名。

【注意事项】

关于索引的编号,VFP将所有打开的单索引和复合索引的索引标记统一编号,编号的次序是:表文件、单索引名、结构复合索引各标记、非结构复合索引各标记。单索引按在INDEXIndexFileList子句中的先后次序编号;索引标记按各索引在所属复合索引文件中所建的先后次序编号。表5.1给出了编号的次序。在许多时候,用户很难记清楚究竟有多少单索引被打开、复合索引中有多少个索引标记以及各标记创建的次序,这就为使用索引编号确定主控索引带来了麻烦。

然而用户却明白,希望把哪个索引作为主控索引,为此使用nIndexFileList倒不如使用IDXFileName或[TAG]TagName[OFCDXFileName]子句来确定主控索引更方便。

例5.5

设为xsjbqkb.dbf已经按姓名字段创建了单索引xm.idx,在结构复合索引文件中已经存在了一个索引标记“性别日期”,请将它们和表一并同时打开,并将索引标记“性别日期”设置为主控索引。

USExsjbqkbINDEXxmORDER性别日期

2)索引文件的单独打开

在有些情况下,当表打开后需要打开一些尚未与表同时打开的非结构复合索引文件或单索引文件。此时,应使用单独打开索引的命令SETINDEXTO。

【命令格式】

SETINDEXTO[IndexFileList|?]

[ORDER[nIndexNumber|IDXFileName|[TAG]TagName[OFCDXFileName]

[ASCENDING|DESCENDING]][ADDITIVE]

【功能】

该命令用于打开一个或多个与当前表有关的索引。

【参数和子句说明】

● ADDITIVE:指定在打开新的索引文件时,是否关闭除结构复合索引之外的原已打开的索引。有此关键字,表示不关闭原来打开的索引,从而使新老索引同时起作用,否则表示关闭原来打开的索引。

●其它参数和子句与USE命令中的意义相同。

例5.6

设表xsjbqkb.dbf已提前打开,请打开单索引文件xm.idx,并将它确定为主控索引。

SETINDEXTOxmORDERxm

实际上,最后一个打开的索引文件一定是主控索引,因此上例中即使没有ORDER子句,xm也会成为主控索引。

3)索引的关闭

关闭索引文件,对于单索引文件和非结构复合索引文件,都要通过命令方式来进行。其方法有三种。

方法1,使用不带任何短语或参数的USE命令。由于索引文件是紧紧依赖表文件的,因此关闭表就可将与该表有关的所有复合索引文件和单索引文件关闭。而关闭当前表命令是不带短语和参数的命令USE。

方法2,使用关闭索引命令SETINDEXTO。

方法3,使用专门的索引文件关闭命令CLOSEINDEXES。

方法3可关闭当前工作区打开的所有非结构复合索引文件和单索引文件,但并不关闭结构复合索引文件。

例5.7

关闭表xsjbqkb.dbf及其全部打开的索引。

USE2.重新索引

如果仅打开了表和部分索引,那么对表的修改将不会反映到未打开的索引中去,这样会造成表与某些索引不一致。此时需要对索引进行重新索引,以取得索引与更新后的表文件数据的一致。重新索引非常简单:在菜单方式下,通过系统菜单中“表”菜单下的“重新建立索引”选项进行;命令方式用REINDEX。命令方式重新索引的操作步骤如下:

S1:将所有与表有关的索引全部打开。

S2:重新索引。输入命令:

REINDEX

3.设置主控索引

当为一个表创建了多个索引后,对于每个索引,记录的逻辑排序次序不同,但在某一时刻,只能由一个索引控制表的显示和操作次序,这个索引叫主控索引或称为当前索引。

事实上,设置主控索引的菜单方法在前面已讲述过,即通过工作区属性对话框的索引顺序列表框进行。在命令方式下,USE、SETINDEX命令中也含有设置主索引的短语。单独设置主控索引的命令如下

【命令格式】

SETORDERTO[[nIndexNumber|IDXIndexFileName|[TAG]TagName

[OFCDXFileName][INnWorkArea|cTableAlias]

[ASCENDING|DESCENDING]]

【功能】

该命令用于将单索引或复合索引文件中指定索引标记设为主控索引或取消先前已设置的主控索引。

【参数和子句说明】

该命令中的参数和子句均与USE命令中的意义相同。如果在SETORDERTO之后无参数和子句,则表示取消先前的主控索引而改按无顺序方式进行操作。

例5.8

将例5.6中打开的结构复合索引文件中的索引标记“性别日期”设置为主控索引。

USExszhjfb

SETORDETOTAG性别日期&&将“性别日期”设为主控索引

4.索引查询

索引查询在表以要查询的关键字为索引表达式创建了索引并打开了该索引的前提下进行。由于表此时的操作次序是按要查询表达式的值升序或降序有序排列的,因此可使用数学上的折半查询法来查询。在VFP中,折半查询被称为索引查询。由于查询的速度很快,因此相对于顺序查询LOCATE,又称折半查询为快速查询。查询命令为SEEK。

【命令格式】

SEEKExpression[ORDERnIndexNumber|IDXIndexFileName|[TAG]TagName

[OFCDXFileName]

[ASCENDING|DESCENDING]]

[INnWorkArea|cTableAlias]

【功能】

该命令用于将记录指针定位在与查询表达式值相匹配的首条记录上,或确定没有与查询关键字的值相匹配的记录。

【参数和子句说明】

● Expression:指定要查询的表达式的值,它必须是一个精确值。它可以是常量、变量、表达式或Null值。除数值型外,其它类型必须要有各自的定界符。

●其它子句和参数同于在前面各命令中的意义。满足条件的首条记录是否找到,照样可以用FOUND()函数来判别。

例5.9

在xscjb.dbf中,用字段“总分”的降序创建一个结构复合索引的标记“总分”,然后快速查找总分等于594的记录。

USExscjb

INDEXON总分TAG总分

SEEK594&&提示栏显示:记录5/12,说明表共12条记录,指针指向第5条

?FOUND(),EOF()&&显示.T..F.

DISPLAY

显示结果如图5.5所示。图5.5SEEK查询结果显示由于表是以索引方式打开的,因此索引关键字值相同的记录已排列在了一起,所以当要查询满足条件的第2条记录时,只要使用SKIP命令即可。但此时不管下一条记录是否为满足条件的新记录,测试函数FOUND()都保持着逻辑真不变,因此只能通过DISPLAY命令显示其记录来判断是否是满足条件的新记录。

5.SEEK函数

SEEK函数将起到SEEK命令和FOUND()函数二者的共同作用,既可查找到希望的第1条记录或确定无希望的记录,又可返回是否找到的逻辑值。

【函数格式】

SEEK(Expression[,nWorkArea|cTableAlias[,nIndexNumber|cIDXIndexFileName|cTagName]])

【功能】

SEEK函数用于在指定的工作区中快速查询索引表达式与查询表达式相匹配的第1条记录,如查到则返回.T.,并将记录指针指向该记录;否则返回.F.,并将记录指针指向表文件的尾部。

【参数和子句说明】

● Expression:要查询的表达式。

● nWorkArea|cTableAlias:指定查询的工作区或别名,缺省时为当前表。

● nIndexNumber|cIDXIndexFileName|cTagName:指定被查询的索引的编号、单索引文件名或结构复合索引的标记

名称。

例5.10

使用SEEK函数在xsjbqkb.dbf中查询有关记录。

USExsjbqkb

?SEEK('女'+DTOC({^1990/08/18}),'xsjbqkb','性别日期'),RECNO(),FOUND()

DISPLAY

显示结果如图5.6所示。图5.6SEEK函数的功能5.2多 个 表 联 访

在第1章中,我们曾强调指出,一个实际的关系模型常常会包含若干个关系。即对于一个实际的关系型数据库,经常会涉及到若干个数据表。VisualFoxPro9.0提供了可以同时进行多个表的联合访问(联访)操作方式,即多工作区操作。

5.2.1工作区

所谓工作区,指将连续的内存空间,逻辑上划分为若干个相对独立的区间,每个区间允许打开一个表文件。如果要在一个工作区中打开第二个表文件,那么第一个表文件先自动关闭,然后才打开第二个文件。VisualFoxPro9.0共设置了32767个工作区,供用户选用。

1.多区操作的特点

多区操作具有如下特点:

(1)每个工作区同时只能打开一个表文件,一个表文件也不能在一个以上的工作区同时打开,否则会出现“文件正在使用”的提示信息。

(2)不论已经使用了多少个工作区,只有一个是当前工作区,在当前工作区中打开的表文件就是当前表文件。系统启动后,默认1号工作区为当前工作区,用户可以使用命令选择1~32767个工作区号中的任意一个作为当前工作区, 但同时最多只能使用255个工作区。

(3)每个工作区为打开的表文件设置一个记录指针,在一般情况下它们各自独立移动,互不干扰。

2.多区操作的种类

多区操作主要包括下列几种情况:

(1)用同一条命令访问多个工作区中的数据。例如,命令LISTFieldList

中的字段名列表可以取自不同的工作区中的表。

(2)使用专用的多区操作命令。如SETRELATION命令、JOIN命令等都能实现多区操作。它们的共同特点是:能使多个工作区中的记录指针实现联动,从而提高数据处理效率。

(3)对多个工作区同时生效的操作。例如:

● CLOSEDATABASE:可关闭所有的数据库、数据表文件、索引文件等。

● CLOSETABLESALL:可关闭所有的数据表文件。

● CLEARALL:可清除所有内存变量、窗口、菜单等,也可关闭所有用户打开的文件。

3.工作区的标识

工作区的标识用来区别所选定的工作区,它有以下四种

标识:

(1)使用工作区编号。工作区编号的选择范围为1~32767。

(2)使用系统工作区别名。前10个工作区用A~J来表示各自的工作区别名,自11号工作区开始,在编号前加上“W”代表工作区的别名。例如,“W254”等价于第254号工作区。

(3)用表名做工作区别名。当表以不带别名短语ALIASAlias的形式打开后,表文件名可作为工作区标识。

(4)用表的别名做工作区别名。当表以带有别名短语ALIASAlias的形式打开后,别名也可作为工作区的标识。例如,若执行了命令:

USExsjbqkbALIASjbqkIN4

则4号工作区可使用三种标识符:4、D、jbqk。

但如果执行命令:

USExsjbqkbIN4

则4号工作区又有三种标识符:4、D、xsjbqkb。

4.工作区的选择

【命令格式】

SELECTnWorkArea|cTableAlias|0

【功能】

该命令用于激活所选定的工作区。

【参数及子句说明】

● nWorkArea:系统给出的工作区号,取值范围为1~32767;也可使用A~J、W11~W32767。

● cTableAlias:表的别名,如果表没有起别名,则可以用表名代替别名。

● 0:指定区号最小的一个未用工作区。

【说明】

函数SELECT()可返回当前工作区号;函数ALIAS([nWorkArea])可返回当前工作区或指定的工作区别名。

例5.11

工作区选择举例。

CLEARALL

USExsjbqkb

&&在1号工作区打开表xsjbqkb.dbf

SELECT3

&&选择3号工作区

USExscjbALIAScj

&&在3号区以别名cj打开表xscjb.dbf

USEkcdmbIN0

&&在2号工作区打开表lcdmb.dbf5.2.2建立表间的临时关系

多个表操作时,必然涉及访问不同工作区中的数据问题和不同工作区间记录指针是否能同步移动的问题。前者是工作区的联访问题,后者是“记录指针跟随”问题。

1.工作区的联访

在当前工作区中访问其它工作区的字段,称为多工作区表的联防,简称工作区联访。此时,对于非当前工作区中要访问的字段,应在字段名称前加上它所在的工作区标识,并将工作区标识与字段名用联访符相连接。联访有两种格式:格式1:AliasName->FieldName

格式2:AliasName.FieldName

其中的“->”、“.”为联访符。

例5.12

显示学生李会琴的各科成绩。

CLEARALL

USExsjbqkb

LOCATEFOR姓名=“李会琴”

DISPLAY

&&显示“李会琴”的有关数据,如图5-7中的第1、2行

USExscjbIN0

SELECTxscjb

LOCATEFOR学号=xsjbqkb.学号

&&工作区联访,将当前工作区的记录定位于

与xsjbqkb.dbf中李会琴的学号相等的记录

DISPLAY

&&显示李会琴的学习成绩,如图5.7中的第3、4行图5.7如果此时再执行下面的DISPLAY命令:

DISPLAYALL学号,xsjbqkb.姓名,K001,K002,K003,K004,K005,K006,K007,总分

则显示的结果将如图5.8所示。图5.8未建表间临时关系的联访结果结果表明,除姓名字段全部显示为“李会琴”外,其余各字段都是当前工作区中表xscjb.dbf的各条记录的值。而姓名来自于xsjbqkb.dbf,系工作区的联访,它始终显示“李会琴”,说明在多工作区中联访时,各表的记录指针相互独立,一个工作区记录指针的移动并不能影响到另一工作区。因此在执行DISPLAY命令时,尽管xscjb工作区的记录指针在逐条递增变化,但它并不会引起xsjbqkb工作区的记录指针的同步变化。在xsjbqkb工作区记录始终指向第2条未动,所以显示出来的姓名是不会变化的。

要想使多个工作区联访时指针发生同步变化,即“指针跟随”,则必须使用表的临时关联。

2.建立表间的临时关系

由于关系型数据库系统的一个重要特点是表之间关联的结果将是一种新的关系,因此把表之间的关联也称为表之间的关系。所谓建立表间的关系,是指利用表之间存在的被称为“关系表达式”的共有字段将它们联系起来。它分为永久关系和临时关系。

永久关系将作为数据库结构的一部分被永久地保存下来。临时关系与是否属于同一数据库表还是自由表无关,这样的表间关系可随时建立或解除。临时关系的最大特点是在建立了临时关系的表之间将发生“指针跟随”现象,当父表的记录指针移动时,子表的记录指针将跟着移动到对应的记录上。下面将介绍表间的临时关系。

1)建立表间临时关系的命令

表的临时关系用命令SETREPLATIONTO来创建。

【命令格式】

SETRELATIONTO[Expression1INTOnWorkArea1|cTableAlias1

[,Expression2INTOnWorkArea2|cTableAlias2...]

[INnWorkArea|cTableAlias][ADDITIVE]]

【功能】

该命令用于在当前表文件(父表)与其它表文件(子表)之间建立临时关联。

【参数及子句说明】

● Expression1、Expression2:指定在父表和子表之间建立临时关系所用的关系表达式。它通常是用来控制子表索引的一个索引表达式。如果Expression是数值型的,则当父表的记录指针移动时它将计算出对应值。子表的记录指针将移动到Expression的值给出的记录上。如果缺省所有参数和子句,则SETRELATIONTO将解除当前工作区的所有临时关系。● INTOnWorkArea1|cTableAlias1、INTOnWorkArea2|cTableAlias2…:指定子表的工作区号或别名。

● INnWorkArea|cTableAlias:指定父表的工作区或别名。IN子句允许创建关联时,不必首先选择父表所在工作区。如果缺省本子句,则父表必须在当前工作区打开。

● ADDITIVE:保留当前工作区中已存在的所有关联关系,并创建新的关联关系。如果缺省ADDITIVE关键字,则首先取消原存在的关联关系,再创建新的关联关系。

2)建立两个表临时关联的条件

(1)两个表必须同时分别在不同的工作区打开。

(2)两个表中都必须拥有“相同”的字段。所谓相同字段,并不是指字段名一定相同,而是指字段的值域必须一致,字段名可以不相同。

(3)表间关系可以有两种方式,若在创建命令中表达式Expression是索引表达式,则子表必须用此索引表达式创建了索引,且此索引已打开。若Expression是数值表达式,则此时子表不必索引。

3)记录指针的跟随方式

两个表建立关联后,每当父表中的记录指针移动时,子表中的记录指针便按指定的关联条件而随之移动,移动方法也分两种情况。

(1)表若按表达式建立关联,此时在子表中便自动执行一次SEEK命令。若在子表中找到与关键字表达式值相匹配的记录,则子表的记录指针就定位于与之匹配的首条记录上;若找不到,则子表指针移至文件末尾。

(2)两表若按数值表达式建立关联,则在子表中便自动执行一次GO命令,将记录指针定位于记录号等于此数值表达式值的那条记录上。

3.表间临时关系的撤销

如果命令中所有的选项都缺省,即采用:

SETRELATIONTO

的格式,就可撤消与当前表文件已经建立的一切关联。

例5.13

显示所有学生的学号、姓名、总分,其中学号、姓名来自父表xsjbqkb.dbf,学习成绩来自子表xscjb.dbf。

CLEARALL

USExsjbqkb

USExscjbIN2

SELECT2

INDEXON学号TAG学号

SELECT1

SETRELATIONTO学号INTOxscjb

LIST学号,姓名,xscjb.总分

命令序列的执行结果如图5.9所示。图5.9表间临时关系建立后的联访结果

练习五

一、选择题

1.随表自动同时打开、更新、关闭、删除的索引文件是()。

A)单索引文件B)非结构复合索引文件

C)结构复合索引文件D)二进制索引文件

2.当表用某个字段建立()索引后,在录入数据时,可有效避免该字段录入重复值。

A)候选索引 B)唯一索引

C)二进制索引 D)普通索引

3.主索引和候选索引存储在()索引文件中。

A)独立 B)非

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论