|
|
|
|
|
动态改变据库表(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
【发表评论】
|
|||||||