2.5 索引记录
为了使用户能够快速查找到需要的记录,往往需要根据表中某些字段值,建立一个逻辑顺序的索引文件,从而按不同的顺序处理记录。用户也可以根据这些索引创建自定义的表间关系,准确地访问记录。
建立一个索引文件时,表中记录的物理存储顺序保持不变,它存储的实际上是根据索引关键字进行逻辑排序的一组记录号。
2.5.1 索引的类型
表中用来确定索引顺序的字段,称为关键字字段,也称为索引关键字。在Visual FoxPro 6.0中,索引有主索引、候选索引、普通索引和唯一索引四种类型。
1.主索引
主索引又称为主关键字,一个表中只能有一个主索引,建立索引的关键字段值不允许重复,它可确保字段中数据的唯一性,同时也决定了表中记录的排列依据。如果表中已经有了一个主索引,可以继续添加候选索引。在Visual FoxPro 6.0中,自由表不能建立主索引。
2.候选索引
候选索引和主索引一样,要求字段值的唯一性,并决定了处理记录的顺序。候选索引不仅适用于数据库表,也适用于自由表,而且每个表可以建立多个候选索引。
3.普通索引
普通索引也可以用来作为记录排列的依据,它的最大特点是该字段中的数据不需要唯一性,允许字段有重复值。一个表中可以建立多个普通索引。
4.唯一索引
唯一索引主要为兼容旧版本而设定。唯一索引用来选定一组记录,并根据指定字段值第一次出现的位置来选择和排列记录。实际上,这种功能可以通过建立查询或视图来实现。
2.5.2 建立索引
建立索引可以使用表设计器,也可以使用命令方式。
1.使用表设计器建立索引
【例9】以“学籍”表的“学号”字段为主关键字建立主索引,“入学成绩”字段为次关键字建立普通索引。
由于“学籍”表中的“学号”字段值具有唯一性,可将其作为主关键字索引,而“入学成绩”字段值不具有唯一性,因此,该字段可以设置为普通索引。建立索引的具体操作步骤如下:
(1)在项目管理器窗口中选择“学籍”表,单击“修改”按钮,打开表设计器,选择“索引”选项卡,在“索引名”处输入索引名,如输入“学号”,也可以是由字段名组成的表达式,“类型”为“主索引”,选择升序排序,索引关键字“表达式”为“学号”。如果指定符合条件的记录参加索引,可在“筛选”框中输入筛选表达式,设定筛选条件。
(2)同样的方法,用“入学成绩”字段为次关键字,建立普通索引。结果如图2-37所示。
图2-37 “索引”选项卡
(3)单击“确定”按钮,保存创建的索引。
在项目管理器窗口的“学籍”表中可以查看索引标记,如图2-38所示。
图2-38 “项目管理器”窗口
在表设计器的“索引”选项卡中,可以修改已建立的索引,如索引名、类型、排序方式等。同时,也可以利用窗口中的“插入”和“删除”命令按钮,插入或者删除索引。
2.命令方式
使用INDEX命令也可以建立一个索引文件。其格式如下:
INDEX ON <索引表达式> TAG <索引名> [OF <索引文件名>] [FOR <条件>] [ASCENDING | DESCENDING] [UNIQUE] [CANDIDATE]
说明:
该命令建立复合索引文件。
Visual FoxPro 6.0中有两种类型的索引文件:单索引文件和复合索引文件。单索引文件是根据一个索引关键字表达式(或关键字)建立的索引文件,文件扩展名为.IDX,只能使用INDEX命令来建立,这也是为了兼容以前版本而保留的索引文件。复合索引文件是指索引文件中可以包含多个索引标识,扩展名为.CDX。每个索引标识与单索引文件类似,也可以根据一个索引关键字表达式(或关键字)建立。复合索引文件中的每一个索引标识由其唯一的索引名(TAG)来识别。
复合索引文件分为两种类型:结构复合索引文件和非结构复合索引文件。结构复合索引文件与其表文件具有相同的文件名(扩展名不同),每当打开表时,此表的结构复合索引文件一并自动打开。非结构复合索引文件名由用户指定,但不能与表同名,在打开表文件时,非结构复合索引文件不会自动打开。
OF <索引文件名>:表示建立非结构复合索引文件,省略该选项,则表示建立结构复合索引文件。
ASCENDING| DESCENDING:表示建立升序或降序索引,默认为升序。
UNIQUE:表示建立唯一索引。
CANDIDATE:表示建立候选索引。
有如下列命令:
USE 学籍 INDEX ON 出生日期 TAG 生日
则以“出生日期”为关键字,索引名为“生日”建立了升序普通索引。
索引关键字可以是表达式,例如,以“专业”和“入学成绩”为关键字建立普通索引,其命令如下:
INDEX ON 专业+STR(入学成绩,5,1) TAG ZC
打开表设计器可以观察到将前面建立的两个索引项添加到了结构复合索引文件中,如图2-39所示。
图2-39 添加索引项的表设计器
在“学籍”表中以“出生日期”为关键字建立非结构复合索引文件,索引名为SR,索引文件名为BIRTH,命令如下:
INDEX ON 出生日期 TAG SR OF BIRTH
运行该命令后,在当前文件夹中建立了Birth.cdx非结构复合索引文件,该索引项也出现在表设计器中。
一个表文件只能有一个结构复合索引文件,它里面可以包含多项索引,这些索引用索引标识来区分。
2.5.3 使用索引
1.打开索引文件
在打开表时,与表文件名相同的结构复合索引文件自动打开,而非结构复合索引文件需要用命令方式来打开。打开索引文件的命令格式如下:
SET INDEX TO <索引文件表> [ORDER <数值表达式> [TAG] <索引名> [OF <复合索引文件名>]]
说明:
该命令是在已经打开表的前提下,打开索引文件,在索引文件列表中,第一个索引为主控索引。
在打开的索引文件列表中,如果单索引文件在前,则该单索引文件为主控索引;如果复合索引文件在前,则需要指定主控索引,否则按原记录的排列顺序显示和访问记录。
例如,打开前面建立的“BIRTH.cdx”非结构复合索引文件,其命令如下:
SET INDEX TO BIRTH
不带参数的SET INDEX TO命令则关闭打开的索引文件,如果是结构复合索引文件,则取消指定的主控索引。
2.设置主控索引
由于复合索引文件中可以包含多个索引项,打开复合索引文件时,还必须设置一个索引为主控索引。设置主控索引的命令格式如下:
SET ORDER TO [<数值表达式> [TAG] <索引名> [OF <复合索引文件名>] [ASCENDING | DESCENDING]]
说明:
该命令的功能是设置主控索引。
<数值表达式>用来指定主控索引,索引项的顺序是建立复合索引时的顺序。由于索引顺序不易记忆,可以使用TAG <索引名> OF <复合索引文件名>命令指定复合索引文件中的一个索引为主控索引,<索引名>可以是结构复合索引文件中的索引名,也可以是已经打开的非结构复合索引文件中的索引名。当有多个同名的索引名时,OF <复合索引文件名> 选项用来确定索引名来自哪个复合索引文件。
在图2-39创建的复合索引文件顺序中,指定第2个索引为主控索引,命令如下:
SET ORDER TO 2
或
SET ORDER TO TAG 入学成绩
通过“浏览”记录窗口可以观察到索引的结果,记录按“入学成绩”字段值降序排列,如图2-40所示。
可以看出,虽然可以同时打开多个索引文件,但在某一时刻,只有一个.IDX文件(主控索引文件)或.CDX文件中的标识(主控索引),用来控制表中记录的显示和访问顺序。
图2-40 按入学成绩索引后的记录排列结果
在理解INDEX ON、SET INDEX TO、SET INDEX、SET ORDER命令时,可以把握这样的顺序:创建索引的命令是INDEX ON,可以创建除主索引之外的其他索引,并将索引保存到各种索引文件中;索引创建后可以用SET INDEX 命令打开,并可顺序指定主控索引;当打开多个索引之后,要改变主控索引,就需要用SET ORDER命令。
3.查看索引结果
为表建立索引后,在“工作区属性”对话框中可以按指定的索引查看索引结果。操作方法如下:
(1)在项目管理器中选择“学籍”表,单击“浏览”按钮,再单击“表”菜单中的“属性”命令,打开“工作区属性”对话框,在“索引顺序”下拉列表中选择一种索引顺序,如图2-41所示。其中,<无顺序>表示不按任何索引项来排列,只按数据原始的输入顺序来显示。
图2-41 选择索引项
(2)单击“确定”按钮。
在浏览记录窗口中可以观察到记录按选择的索引顺序排列。
4.重新索引
当对表中的记录进行增加、删除、修改时,系统会更新打开的索引文件,以保持索引的内容有效。但是,如果某些索引没有和表一起打开,当更改表中数据时,没有打开的索引不会得到更新,会变得过时,这些索引必须重建后才能使用,此时需要用REINDEX命令。命令格式如下:
REINDEX
说明:
该命令重新索引当前工作区中打开的所有索引文件。因此,在应用此命令前,最好打开表的所有索引,而且被索引的表必须以独占方式打开。
5.索引查找记录
在索引查找记录之前,表必须先建立索引文件,被查找的内容必须与主控索引的索引表达式一致。索引查找记录可以使用SEEK命令,其格式如下:
SEEK <表达式>
说明:
该命令在当前索引中查找与表达式相匹配的首记录。
用该命令查找字符串时,字符串必须用定界符(“ ”、‘’或[ ])引起来。
例如,在“学籍”表中查找入学成绩是521的记录。
操作命令如下:
USE 学籍 &&同时打开了结构复合文件 SET ORDER TO 入学成绩 SEEK 521 DISPLAY &&显示当前记录
屏幕显示:
记录号 学号 姓名 性别 民族 出生日期 入学成绩 专业 团员 照片 简历 6 120102 万 亮 男 汉 01/17/96 521.0 国际商务 .T. gen memo
使用SEEK命令只能查找与字符串或表达式相匹配的首记录。如果主控索引中相匹配的记录很多,由于在建立索引时关键字相同的记录都排列在一起,因此可以使用SKIP命令来移动记录指针,查找下一条记录,直到出现不匹配的记录为止。
和LOCATE命令相比,SEEK命令在定位记录时速度相当快。但SEEK命令需要一个索引,而LOCATE命令不需要。
6.关闭和删除索引
要关闭当前打开的单索引和复合索引文件,可以使用CLOSE命令,其格式为
CLOSE INDEXES
该命令不会关闭和表同时打开的结构复合索引文件。
在Visual FoxPro 6.0中,要从结构复合索引文件中删除索引,可以使用DELETE TAG命令;若要删除非结构复合索引文件中的索引,可以使用DELETE TAG命令的OF选项,其命令格式:
DELETE TAG <索引名> [OF <复合索引文件名>]
例如,删除“学籍”表结构复合索引文件中索引名为“生日”索引,可以使用命令:
USE 学籍 DELETE TAG 生日
如果要删除复合索引文件中的所有索引,可以使用命令:
DELETE TAG ALL
如果.IDX单索引文件没有打开,删除该文件,可以使用DELETE FILE命令。
试一试
1.在“部门”表中设置“部门编号”字段为主控索引,索引名为“部门编号”。
2.在“教师”表中设置“教师编号”字段为主控索引,索引名为“教师编号”。
3.在“教师”表中设置“工资”字段为降序排列普通索引,索引名为“工资”。
4.在“教师”表中设置“部门”字段为普通索引,索引名为“部门”。
5.在教师结构复合索引文件中,指定索引标识“部门”为主控索引。
6.在教师结构复合索引文件中,指定索引标识“教师编号”为主控索引。
7.在“学生”数据库中建立“教师任课”表,表结构如表2-7所示,并输入记录。
表2-7 “教师任课”表字段及其属性
8.在“教师任课”表中,在“教师编号”字段上建立普通索引;“课程号”字段上建立普通索引,在“上课班级”字段上建立普通索引。