3.2 索引
如果表中记录比较多,在表中自上而下地顺序查找某个记录就要花费较长时间。为了减少查找时间、实现快速查询,可以为表建立索引,之后就可以指定按已有的某个索引的顺序查询表中的记录。
3.2.1 索引的概念及类型
索引就是依据表中某些字段(或含字段的表达式)建立记录的逻辑顺序,索引所依据的字段或含字段的表达式称为索引关键字。为表创建的索引存储在索引文件中,索引文件是表文件的一个辅助性文件(索引文件和表文件是分别存储的),它是将记录的顺序按关键字重新排列,所存储的仅是记录指针的逻辑顺序,而不改变表中记录的物理顺序和记录号。与排序文件相比,索引文件占用的存储空间小,查询速度快。
可以依据不同的索引关键字为一个表建立多个索引。例如,可以为TEACHER表建立两个索引,一个是按“月收入”字段升序排列的索引,另一个是按“姓名”字段升序排列的索引,这样就可以分别按收入和姓名进行快速查询了。
索引文件有两种类型:单索引文件(IDX)和复合索引文件(CDX)。
单索引文件只包括一个索引关键字(如teacher表按月收入字段建立索引文件)。复合索引文件允许包含多个索引项(如teacher表按性别和月收入两个字段建立索引文件),每个索引项可指定一个索引标识(Index Tag),作为索引文件的别名。复合索引文件又分为结构复合索引和非结构复合索引。结构复合索引文件是和表名相同的复合索引文件(如“TEACHER”表的结构复合索引文件名为“TEACHER.CDX”),它随表的打开而打开,在表记录的添加、删除和修改时会自动更改。非结构复合索引是用户为它另起了名字的索引文件(扩展名仍为.CDX),使用时要用相应的打开命令来打开。
VFP中,可以为数据库表建立四种索引:主索引、候选索引、唯一索引和普通索引。对于自由表,只可以建立和使用候选索引、唯一索引和普通索引。
1.主索引
主索引可以确保索引关键字中输入值的唯一性并确定记录的先后顺序。对于数据库中的每个表,只能建立一个主索引,如果某个数据库表已经有了一个主索引,则只能为该表继续创建其他三种索引。主索引要求在整个表中索引关键字不能出现重复值或NULL值。如果把某个已含有重复数据或NULL值的字段指定为主索引关键字,或者在已定义为主索引的关键字段中输入重复值或NULL值,VFP都将给出错误信息。
主索引就是数据库表的主键,对于自由表,则没有主键的概念。
2.候选索引
候选索引与主索引的要求和作用是一样的,“候选”的含义是它们在表中有资格被选为主索引,是主索引的候选者。每个数据库表和自由表都可以建立多个候选索引。
3.唯一索引
VFP为了保持同早期版本的兼容性,还允许建立唯一索引。唯一索引允许表中索引关键字段存在重复值,但它只记录每个索引关键字值在表中的首次出现,它不能防止用户继续向表中输入重复的索引关键字值的记录。可以为一个表建立多个唯一索引。
4.普通索引
如果希望允许在索引关键字中出现重复值,可以使用普通索引。普通索引适合用在包含重复索引关键字值的表中逻辑排序记录和查询。在一个表中可以建立多个普通索引。
在唯一索引和普通索引中,都允许索引关键字出现NULL值,所有的NULL值记录将排在所有的非NULL值记录之前。
3.2.2 索引文件的建立
若要建立索引,首先打开要建立索引的表,然后打开“表设计器”窗口,选择其中的“索引”选项卡,如图3.1所示为TEACHER表建立的三个索引。
图3.1 “表设计器”的“索引”选项卡
1.添加索引
要添加一个新的索引,可以在“表设计器”窗口的“索引”选项卡中单击“插入”按钮,然后利用“索引”选项卡中的各输入框和按钮设置该索引。
(1)“索引名”框,用于输入一个标识符作为索引名,也称为索引标志。同一个表的各个索引名不能相同。
(2)“类型”框,用于选择索引类型。
(3)“表达式”框,用于输入索引关键字表达式,单击带“…”符号的按钮可以打开“表达式生成器”来生成索引关键字表达式。表达式中应含有表的一个或多个字段,并且不能含有通用型或备注型字段。如果含有多个不同类型的字段,应采用类型转换函数使它们能构成一个合法的表达式。
(4)“排序”按钮,表明索引中索引关键字的排序方式,即升序(“↑”)或降序(“↓”),单击该按钮可以改变排序方向。
(5)“筛选”框,用于输入筛选表达式,表中只有符合筛选表达式的记录才被索引。
此外,上下拖动每行最左侧的标记块可以改变索引的排列顺序。单击“删除”按钮可以删除一个索引。
2.快速建立索引
可以在“表设计器”窗口中快速建立索引。在“字段”选项卡中选定一个字段,在它的“索引”下拉列表框中选择一种索引顺序,这样就建立了一个普通索引,默认索引名和索引关键字表达式都是字段本身。然后打开“索引”选项卡就可以看到这个索引,并可以修改该索引了。
3.索引命令INDEX
(1)单索引文件的建立。
【命令格式】 INDEX ON <索引表达式> TO <索引文件名> [FOR<条件>][UNIQUE] [ADDITIVE]
(2)复合索引文件的建立。
【命令格式】 INDEX ON <索引表达式> TAG <索引标识> [OF <复合索引文件名>] [FOR <条件>] [UNIQUE] [ASCENDING/DESCENDING] [ADDITIVE]
【说明】
(1)索引表达式的数据类型可以是字符型、数值型、日期型、逻辑型,但不能是备注型和通用型。
(2)索引表达式可以是一个字段,也可以是多个字段,当为多个字段时要用连接运算符(+//)将多个字段连接起来,并要求各字段的数据类型一致。
(3)若有UNIQUE选项,表示在索引项中若有相同的字段值时只记录第1项。
(4)ADDITIVE选项表示在建立新的索引文件时不关闭原来打开的索引文件。
(5)索引标识为索引文件的别名。若只有TAG〈索引标识〉而缺省OF〈复合索引文件名〉选项,则建立的索引文件属于结构复合索引文件;若有OF〈复合索引文件名〉选项,则建立的索引文件属于非结构复合索引文件。
(6)ASCENDING为升序,DESCENDING为降序。若缺省升序和降序,则默认为升序。降序只能在结构复合索引文件中设置,而不能在单索引文件和非结构复合索引文件中设置。
【例 3.2】 以月收入为索引关键字对TEACHER表建立单索引文件,索引文件名为ATEACHER.IDX。
USE TEACHER INDEX ON 月收入 TO ATEACHER LIST
显示结果如下:
【例 3.3】 为TEACHER表建立结构复合索引文件(系统自动生成索引文件名TEACHER.CDX),以姓名降序排列,索引标识为XM;以年龄按升序排列,索引标识为NL。
USE TEACHER INDEX ON 姓名 TAG XM DESCENDING LIST
显示结果如下:
INDEX ON date()-出生年月 TAG NL LIST
显示结果如下:
3.2.3 索引文件的打开
索引文件不能脱离所依赖的数据表文件而单独使用。当建立索引文件时,生成的索引文件呈打开状态。在打开一个数据表文件时,结构复合索引文件将随着数据表文件的打开而自动打开,但如果要使用其他的索引文件,则要使用索引文件的打开命令。
【命令格式】 USE <表文件名> [INDEX <索引文件名表>]
【功能】 打开数据表文件的同时打开INDEX后面指定的各索引文件。
3.2.4 设置主控索引
在打开的索引文件中,排在最前面的索引文件叫主控索引文件,数据表只按主控索引文件的顺序显示各记录。若主控索引文件是复合索引文件,则显示与存取记录的次序仍按各记录实际存放的顺序,只有用ORDER指定主标记后,才按主标记的次序显示与存取记录。对数据表文件进行增加、删除、修改操作时,系统会自动修改所有打开的索引文件。
【命令格式】 SET ORDER TO [<数值表达式>/<单索引文件名>/[TAG <索引标识>][OF <复合索引文件名>] [ASCENDING/DESCENDING]]
【功能】 在打开的索引文件中指定主控索引文件,或在打开的复合索引文件中设置主索引标识。
【说明】 数值表达式的值为0~7,表示打开的第N个索引文件为当前有效的索引。若未指定主控索引,则系统默认为1。若指定0,则退出索引控制,恢复表记录顺序。
【例3.4】 在打开TEACHER的同时,打开相应的索引文件。
USE TEACHER INDEX ATEACHER LIST
显示结果同【例3.2】 ATEACHER。
SET ORDER TO TAG XM LIST
显示结果同【例3.3】 的第一个。
3.2.5 索引文件的关闭
当表关闭时索引文件也随之关闭。
【命令格式】 CLOSE ALL
【功能】 命令关闭所有文件。
【命令格式】 SET INDEX TO
【功能】 关闭当前打开的索引文件。
3.2.6 索引的更新
对数据表进行修改、增加、删除等操作时,如果没有打开相应的索引文件,则这些索引文件不会随着数据表文件的更新而自动更新,这时就需要使用重新索引命令。
【命令格式】 REINDEX
【功能】 重新建立打开的索引文件。
【说明】 使用重新索引命令时,需要先打开数据表文件和需要更新的索引文件。