Visual FoxPro数据库的索引技术在查询效率上可以达到大型数据库的查询效率,其功能是非常强大的。它所建立的索引是在磁盘上存在的索引文件,有单索引文件(*.idx)和复合索引文件(*.cdx)两种;而复合索引文件又有结构复合索引文件与非结构复合索引文件之分,与数据表同名的*.cdx文件称为结构复合索引文件。
索引文件是独立于数据表*.dbf文件的,在表打开的同时,该索引文件自然被打开,当数据表更新时,其当前索引文件也自动更新。在Visual FoxPro中,索引是一个非常重要的功能。
在进行索引操作之前,先来了解索引的几个基本概念。
(1)索引关键字(索引表达式):它是用来建立索引的一个字段或字段表达式。
注意:用多个字段建立索引表达式时,表达式的计算结果将影响索引的结果;不同类型字段构成一个表达式时,必须转换数据类型。
(2)索引标识(索引名):即索引关键字的名称,它必须以下划线、字母或汉字开头,且不可超过10个字。
(3)索引类型:在Visual FoxPro中,它包括主索引、候选索引、普通索引和唯一索引4种。
· 主索引组成主索引关键字的字段或表达式,在表的所有记录中不能有重复的值。主索引只适用于数据库表的结构复合索引中。自由表中不可以建立主索引,在数据库中的每个表能且只能建立一个主索引。
· 候选索引在指定的关键字段或表达式中不允许有重复值的索引。在数据库表和自由表中均可为每个表建立多个候选索引。
· 普通索引也可以决定记录的处理顺序,但是允许字段中出现重复值,它可以在一个表中加入多个普通索引。
· 唯一索引参加索引的关键字段或表达式在表中可以有重复值,但在索引对照表中,具有重复值的记录仅存储其中的第一个。
在所有类型的索引文件中,结构复合索引文件既可以在建表时指定和建立,又可以使用命令方式建立,而独立复合索引文件和独立索引文件都必须使用相应的命令建立索引文件。
使用“表设计器”可以直接创建当前数据表的索引文件,这是Visual FoxPro提供的最简单、最方便的可视化方法。通过“表设计器”虽然只能创建结构复合索引文件,但这正是最常用的索引文件类型。
【例2-11】为学生档案表(xsda.dbf)在“表设计器”中建立索引。
(1)将学生档案表(xsda.dbf)以“表设计器”的方式打开,选中要设置为主索引的字段(编号),然后选择“索引”组合框中的“升序”选项,如图2-30所示。
(2)单击“索引”选项卡,设置字段(编号)类型为唯一索引,如图2-31所示。
图2-30 在“表设计器”中设置字段的索引 图2-31 设置为唯一索引
对“索引”选项卡中的各选项说明如下。
· 排序设置索引排序。索引名左侧有一个箭头按钮,默认是箭头向上,表示按升序索引;若要改变索引顺序,只要单击此箭头按钮,便可以切换为降序。
· 索引名设置索引名称。在“索引名”文本框中为所要创建的索引取一个名称。索引名不可超过10个字符,如果只是根据索引单一字段来创建索引,为方便识别,系统通常会自动用此字段名作为索引名。
注意:建立一个索引名称时,其命名规则应能体现索引类型,所以建议主索引名称可以采用P_XXXXX的形式,类似的候选索引可以采用C_XXXXX的形式,普通索引可以采用R_XXXXX的形式,当然也可以采用自己认为方便的形式。
· 类型设置索引类型。从“类型”的下拉列表中选择所要创建的索引类型。
· 表达式设置索引表达式。在“表达式”的文本框中可以设置索引字段的来源或索引关键字的表达式;或者单击右侧的按钮,在弹出的“表达式生成器”对话框中设置相应的表达式即可,如图3-32所示。
图2-32 “表达式生成器”对话框
· 筛选设置筛选条件。可以在“筛选”中为待索引记录指定一个筛选条件,这样可以提高索引的效率。
(1)建立普通索引。在数据库中普通索引适用于“一对多”永久关系中的“多”方。在程序的运行时建立普通索引的命令格式是:
INDEX ON 索引表达式TAG 索引标识OF CDX文件名[FOR 逻辑表达式]
[ASCENDING|DESCENDING][UNIQUE [CANDIDATE]][ADDITIVE]
或 INDEX ON <关键字表达式> TO <单索引文件名> [FOR <条件>]
[ASCENDING|DESCENDING][UNIQUE [CANDIDATE]][ADDITIVE]
索引中各关键字有其特定的含义。
①“索引表达式”:可以是一个字段名称和几个字段名称的组合,也可以是一个表达式或自定义函数。
②“索引标识”:是“表设计器”中的“索引名”,最大长度可达10个字符数,数据库系统在处理索引时大多依赖于“索引标识”。“ASCENDING”表示以升序建立索引,“DESCENDING”则表示以降序建立索引。
③“OF CDX 文件名”:指明新建索引项存放的独立复合索引文件名。如果忽略该子句,则新建索引项将存放在当前的结构复合索引文件中。
④“FOR 逻辑表达式”:设置筛选索引的子句,其作用是把所访问的记录限制在指定的数据上。当创建了筛选索引之后,只有符合筛选表达式的记录才可显示和访问。
⑤“ASCENDING|DESCENDING”:在命令中加入参数ASCENDING可以创建升序(系统默认升序)索引;若加入参数DESCENDING则可以创建降序索引。
⑥“UNIQUE | CANDIDATE”:如果要创建唯一索引,在命令中加入参数UNIQUE;如果是创建结构复合索引文件,可以在INDEX中添加参数CANDIDATE来创建候选索引。
⑦“ADDITIVE”:在创建独立复合索引文件时,该参数可以使先前打开的独立复合索引文件保持打开状态。
【例2-12】 对学生档案表(xsda.dbf)中所有记录按出生年月先后排序,建立单索引文件。
USE xsda
INDEX ON 出生年月TO xsda-csyy
BROWSE &&显示索引后的数据记录,如图2-33所示
USE
图2-33 按出生年月索引的结果
(2)建立主索引和候选索引。在数据库中,在定义“一对多”或“一对一”永久关系中的“一”方时,既可以使用候选索引,也可以使用主索引。
建立主索引和候选索引的命令格式是:
ALTER TABLE 数据表名称[ADD PRIMARY KEY 索引表达式TAG 索引标识]
[ADD UNIQUE索引表达式[表达式[TAG 索引标识]]
注意:PRIMARY关键字表示所创建的索引是主索引,UNIQUE则表示创建候选索引。设置候选索引时,如果“TAG 索引标识”子句缺省,且“索引表达式”只是一个字段名,则系统会自动将索引标识设置成与字段名相同的名称。
【例2-13】利用命令方式为学生档案表(xsda.dbf)创建多个索引项。
USE xsda
ALTER TABLE xsda ADD PRIMARY KEY编号TAG T_编号
BROWSE &&浏览窗口如图2-34所示
INDEX ON 姓名TAG T_姓名 CANDIDATE
BROWSE &&浏览窗口如图2-35所示
INDEX ON 出生年月TAG T_出生年月
BROWSE &&浏览窗口如图2-36所示
图2-34 以“编号”创建主索引 图2-35 以“姓名”创建候选索引
图2-36 以“出生年月”创建的普通索引
此时选择“显示”→“表设计器”命令,在弹出的对话框中单击“索引”选项卡,即可看到所创建的索引,如图2-37所示。
图2-37 以命令方式为学生档案表(xsda.dbf)创建的索引
如果不及时将不需要的索引标识从复合索引文件中删除,那么在复合索引文件打开时,Visual FoxPro系统会花费时间来维护这些无用的索引标识。为了提高系统效率,需要及时清理无用的索引标记和*.idx索引文件。
利用“表设计器”删除索引标识的操作步骤如下:
(1)使用前面的方法打开数据表后,选择“显示”→“表设计器”命令,或在命令窗口中输入MODIFTY STRUCTRUE命令,便可打开“表设计器”对话框。
(2)在“表设计器”对话框中,单击“索引”选项卡,在索引列表中选择要删除的索引名,如图2-38所示。
图2-38 删除索引标识
(3)单击“删除(D)”按钮,即可将所选择的索引删除。
用户可以通过DELETE TAG命令来删除索引标识,其命令格式为:
DELETE TAG 索引标识名| ALL
DELETE TAG索引标识只删除索引文件中的一个索引,而DELETE TAG ALL则删除所有的索引。
在例2-12的操作过程中,建立了多个索引,下面通过DELETE TAG命令来删除“T_姓名”的索引标识,其命令为:
DELETE TAG T_姓名
注意:在删除主索引或候选索引的时候,系统会弹出提示框,询问是否删除该主索引或候选索引,如图2-39所示。
图2-39 询问是否删除主索引或候选索引标识
由于独立索引文件中只有一个索引关键字表达式,因此可以通过从磁盘上删除*.idx文件的方式删除该索引表达式,其命令格式为:
DELETE FILE IDE文件名
【例2-14】 将学生档案表(xsda.dbf)以“性别”作为索引建立一个索引文件“性别.idx”,然后将其索引文件删除。
USE xsda
INDEX ON 性别TO 性别 &&建立索引文件“性别.idx”
DELETE FILE 性别.idx &&会弹出如图2-40所示的提示框
CLOSE ALL &&只有将该表及索引关闭才能删除
DELETE FILE 性别.idx &&成功删除
图2-40 不能删除打开的索引文件的提示框
索引文件有3种,即结构复合索引文件、独立复合索引文件和独立索引文件,下面分别对这3种索引文件的打开与关闭进行介绍。
由于结构复合索引文件和对应的数据库表一起被打开或关闭,所以对于结构复合索引文件无须显示打开。在打开表之后,就可以直接使用该结构复合索引文件。当然,随着该表的关闭,所对应的结构复合索引文件也随之被关闭。
独立复合索引文件可以与数据库表一起被打开,也可以单独打开。
(1)与数据表同时打开。如果需要与数据表同时打开独立复合索引文件,命令格式为:
USE 数据表名 INDEX 独立复合索引文件名
【例2-15】打开学生档案表(xsda.dbf),并同时打开以“姓名”字段建立的索引文件。
USE xsda
INDEX ON 姓名TO 姓名 &&建立索引文件“姓名.idx”
CLOSE ALL &&全部关闭
USE xsda INDEX 姓名 &&打开数据表并打开索引文件“姓名.idx”
BROWSE &&显示窗口如图2-41所示
图2-41 打开的索引文件
(2)单独方式打开。对于已经打开的数据表,可以通过单独的方式打开索引文件,其命令格式如下:
SET INDEX TO 独立复合索引文件名
【例2-16】以单独的方式打开索引文件“姓名.idx”。
USE xsda
SET INDEX TO 姓名
BROWSE &&显示的结果如图2-41所示
(3)关闭索引文件。关闭独立复合索引文件可以采用以下两种方式。
①SET INDEX TO SET命令只能关闭当前工作区中当前数据表的所有已打开的独立复合索引文件。
②CLOSE INDEXES CLOSE命令可以同时关闭所有工作区中已打开的独立复合索引文件。
由于独立索引文件也不是自动维护的,需要在使用之前打开它。如果使用SET INDEX TO命令可以打开多个独立索引文件,同时可以使用SET ORDER TO命令具体指定打开其中哪个独立索引文件;如果只是打开一个独立索引文件,则不必使用SET ORDER TO作进一步指定。
【例2-17】在学生档案表(xsda.dbf)中有“姓名.idx”和“性别.idx”两个独立的索引文件,但是只需要打开“性别.idx”索引文件。
USE xsda
SET INDEX TO 姓名,性别 &&打开两个索引文件
SET ORDER TO 性别 &&指定“性别.idx”为独立索引文件
BROWSE &&浏览的窗口如图2-42所示
图2-42 打开的独立索引文件
关闭独立索引文件的操作与关闭独立复合索引文件的操作相同。
对于已经建立了索引的数据表,如果对其记录进行了增加或删除记录,应及时对已有的索引文件进行更新。
索引的更新分两种,一是在打开数据表的同时打开有关索引文件,这时对数据表记录的增加或删除将自动使打开的索引文件进行更新;二是在打开数据表时没有打开相关的索引文件,使用REINDEX命令进行索引的更新即可。