|
delphi数据库的索引及应用
纪晓蓉、周友
索引是以某字段为基础,将数据记录按某种顺序排好序。索引的主要优点是通过使用索引,可以很大程度上加快搜索和排序的速度。在这儿我想和大家讨论一下delphi数据库在设计期间和运行期间如何建立索引。以dbdemos数据库别名下的数据库表country.db 为例。该数据库表的字段列表如下:
字段名
|
字段类型 |
字段长度 |
关键字 |
name |
a |
24 |
|
capital |
a |
24 |
|
continent |
a |
24 |
|
area |
n |
|
|
population |
n |
|
|
一、 设计期间索引的建立
在paradox 中定义关键字将自动在该字段上创建一个索引。如上表在字段name上就建立了升序的索引。delphi规定关键字字段必须连续,而且必须从字段列表的第一个字段开始。例如上表在建立索引时,不能直接在capital字段上建立索引,而必须建立了name字段的索引后,才能再建立capital字段的索引。
大多数数据库允许我们建立多个索引,即次级索引。索引不必要是唯一的,这与关键字是不一样的。如何建立次级索引呢?下面就介绍一下如何利用database desktop创建上表的次级索引,以建立area的升序索引为例。
1. 打开database desktop 窗口,选择file | open | table ,选择alias为dbdemos,找到country.db数据库并打开。
2. 选择table | restructure...,将显示此数据库表的字段列表。
3. 在table properties下拉列表框中选择secondary indexes。
4. 单击define...按钮,出现define secondary index对话框。
5. 在左侧的fields列表框中双击area,将area字段移到右边indexed fields列表框中,单击ok按钮。
6. 在弹出的save index as对话框中输入该索引的名称:areaidx,并单击ok按钮。
7. 此时在窗口右边define...按钮的下方列表框中就出现了areaidx,这就是为此数据库表建立的次级索引名。单击save,便完成了次级索引。
delphi规定建立次级索引的前提条件是:主索引必须存在!如果上表的name字段的索引不存在,则按以上步骤就不可能建立area的次级索引。
上面介绍了在程序设计期间可以利用database desktop建立索引,但大多数据情况下数据库是在程序运行期间生成的,例如用tbatchmove控件进行数据库的batcopy操作所生成的数据库,如何进行索引呢?
二、 运行期间索引的建立
在运行期间对数据库进行索引,可以利用ttable控件的addindex方法为数据库建立新的索引。此方法的过程定义为:
procedure addindex(const name, fields: string; options: tindexoptions);
其中name: |
索引文件名,如areaidx,也可以缺省不写。 |
fields: |
要建立的索引字段列表,各字段之间用分号隔开。 |
options: |
索引选项。规定如下: |
ixprimary |
- 创建主索引,主索引必须唯一 |
isunique |
- 创建字段记录唯一的索引 |
ixdescending |
- 按字母降序排序(缺省为升序) |
ixcaseinsensitive |
- 忽略大小写 |
仍以country.db数据库表为例,建立area的索引,可编写如下过程:
procedure tform1.create_index;
begin
table1.close;
// 必须先建立主索引!此例中索引文件名为空
table1.addindex('','name',[ixprimary]);
// 建立area 字段索引,索引文件名为areaidx
table1.addindex('areaidx', 'area',[ ]);
end;
至此我们已经解决了如何在程序设计期间及运行期间建立索引的问题。下面再简单介绍一下如何利用索引进行排序和查询。
三、 利用索引排序
建立索引后我们就可以利用这些索引进行排序。在ttable控件中有两个属性:indexname和indexfieldnames。如果不设置它们,将使用主索引来排序记录,上面数据库表中就是使用name为索引来排序。如果想以area字段排序,可以设置indexname为areaidx,或者设置indexfieldnames为area。但两者是相斥的,不能同时设置。这是在设计期间设好的。在程序运行期间可以这样编写:
table1.indexname := 'areaidx';
或者:
table1.indexfieldnames: = 'area';
这样程序运行后的记录按area的值从小到大排列。
四、 利用索引查询
我们可以利用已建立的索引,进行数据记录的精确查找、模糊查找及记录范围限制等操作:
1. 使用findkey方法实现精确查找:
下面的过程用来查找area 为country_area(用户自定义参数)的记录:
procedure tform1.search_area(const country_area:real);
begin
with table1 do
begin
indexfieldnames := 'area';
if findkey([country_area]) then
showmessage('找到了! ')
else
showmessage('没找到! ');
end;
end;
2. 使用gotokey方法实现精确查找:
下面的过程用来查找name 为country_name(用户自定义参数)的记录:
procedure tform1.search_name(const country_name: string);
begin
with table1 do
begin
indexfieldnames := 'name';
setkey;
fieldbyname('name').asstring := country_name;
if gotokey then
showmessage('找到了!')
else
showmessage('没找到!');
end;
end;
3. 使用findnearest和gotonearest进行模糊查找
下面的过程查找name 为country_name的记录(变量country_name为不完整的国家名):
procedure tform1.nearest_name(country_name: string);
begin
with table1 do
begin
indexfieldnames := 'name';
findnearest([country_name]);
if not eof then
showmessage('找到了!')
else
showmessage('没找到!');
end;
end;
4. 限制记录范围:
下面的过程将记录范围定在area1和area2之间:
procedure tform1.set_range(area1,area2: real);
begin
with table1 do
begin
indexfieldnames := 'area';
setrange([area1],[area2]);
end;
end;
下面的过程取消范围限制:
procedure tform1.cancel_range;
begin
table1.cancelrange;
end;
以上程序在 delphi 3.0,delphi 4.0上调试通过。
|
|
请发表评论