动态改变据库表(Access库)的索引

http://www.xishui.net 2008年06月01日18:58 浠水网

---- 以Paradox数据表为例
索引分为主索引(Primary Index)即关键字(Primary Key)索引和次索引(Secondary Index), 其中主索引对应.PX文件,次索引对应.XG*和.YG*文件.

一. 创建表索引
---- (1)用Table.AddIndex来实现
---- 方 法:AddIndex( IndexName,FieldNames,Options )
---- 其 中:( 详见Delphi 帮助)
---- IndexName: 索引名称,仅在指定次索引时有作用.
---- FieldNames: 索引域, 可指定多个域,各域之间用分号隔开, 如'Field1;Field2;Field3'
---- Options: 索引选项, 可为[ixPrimary, ixUnique, ixDescending, ixCaseInsensitive, ixExpression]
---- 下面是一个例子:

---- 假设有一个存放通讯录数据表MyComm.DB(类型为Paradox)存放于本地目录d:\mynote下,现建立一个主索引(索引域为编号ID)和一个次索引(索引域为编号ID和姓名Name, 索引名称为NameIndex).

  with table1 do
     begin
   close;
   Exclusive := true;
   DatabaseName := 'd:\MyNote';
   TableName := 'MyComm.DB';
   Open;

   {建立主索引 }
   AddIndex(','ID',[ixPrimary]);

   {建立次索引 }
   AddIndex('NameIndex','ID;Name',[]);
   close;
     end;

  (2)用SQL来实现
对Paradox数据表来说,用SQL只能建立次索引.
在SQL语法中,用来建立索引的语句是:
  Create Index IndexName On TableName
  (IndexField1,IndexField2,..)
其中:
  IndexName为一个次索引的名称,如MySecIndex1等.
  TableName为对应数据表的名称,如MyTable等.
  TableName后面为索引域列表,所有索引域有圆括号括起来,
   各索引域之间用逗号隔开.
 
---- 下面是一个例子:

---- 假设有一个存放通讯录数据表MyComm.DB(类型为Paradox)存放于本地目录d:\mynote下,现建立一个次索引(索引域为编号ID和姓名Name,索引名称为NameIndex).

with query1 do
begin
close;
DatabaseName := 'd:\MyNote';

{建立次索引NameIndex}
  sql.clear;
  sql.add( 'Create Index NameIndex On MyComm(ID,Name)' );
     execSql;
end;
 

二. 删除表索引
---- (1) 用Table.DeleteIndex 来实现
---- DeleteIndex只能删除次索引名称.
---- 方 法:DeleteIndex( IndexName )
---- 其 中:( 详见Delphi 帮助)
---- IndexName: 次索引名称.

---- 下面是一个例子:

---- 假设有一个存放通讯录数据表MyComm.DB(类型为Paradox)存放于本地目录d:\mynote下,现有一个次索引(索引域为编号ID和姓名Name,索引名称为NameIndex), 将删除之.

  with table1 do
     begin
   close;
   Exclusive := true;
   DatabaseName := 'd:\MyNote';
   TableName := 'MyComm.DB';
   Open;

   {删除次索引}
   DeleteIndex('NameIndex');
   
   close;
     end;
 

---- (2) 用SQL来实现
---- 在SQL语法中,用来删除索引的语句是:
---- Drop Index TableName.IndexName
---- 要删除次索引时,IndexName 为一个次索引的名称, 如'MyTable.MySecIndex1' 等.
---- 要删除主索引时,IndexName 为'primary', 如'MyTable.primary'; 值得注意的是,在删除主索引成功后,数据表的所有次索引也自动删除.

---- 下面是一个例子:
---- 假设有一个存放通讯录数据表MyComm.DB(类型为Paradox)存放于本地目录d:\mynote下,已定义一个主索引(索引域为编号ID)和一个次索引(索引域为编号ID和姓名Name,索引名称为NameIndex).
---- 现在因为索引损坏,要删除索引,以便重新索引.

  with query1 do
     begin
   close;
   DatabaseName := 'd:\MyNote';

   {删除次索引NameIndex }
          sql.clear;
          sql.add( 'Drop Index MyComm.NameIndex' );
          execSql;

   {删除主索引 }
          sql.clear;
          sql.add( 'Drop Index MyComm.Primary' );
          execSql;
     end;

三. 注 意 事 项:
---- (1) 在索引更改时,应保证对应的数据表可以以独占方式(Exclusive=true)打开,否则会引起错误.
---- (2) 上述方法略加修改后,也可用于dBase,Oracle等它数据库的数据表.
---- (3) 如果需要重新对索引文件进行索引,请参考BDE 的Dbi 
发表评论
上一篇Access数据库和SQL Server 2000数据库简介
下一篇Access 创建索引
正在加载中……