科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件用Dephi程序维护Paradox 数据表的索引

用Dephi程序维护Paradox 数据表的索引

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

索引文件对于改善数据查询速度有着举足轻重的作用,充分使用索引文件可以极大改善数据库应用程序的性能,这一点恐怕是难以否认的.

作者:王发军 来源:popcool开发专区 2007年11月2日

关键字: dephi 程序维护 Paradox 数据表

  • 评论
  • 分享微博
  • 分享邮件
索引文件对于改善数据查询速度有着举足轻重的作用,充分使用索引文件可以极大改善数据库应用程序的性能,这一点恐怕是难以否认的.

  在应用过程中,用户的查询条件可能是多种多样的,如果能根据用户查询建立和选择索引,对于保证应用程序的性能,无疑是很有帮助的.

  另外,由于停电等意外事故很容易造成数据库中的索引文件未及时更新甚至于损坏,此时如果应用程序再出几个错误信息,无疑将使用户的处境雪上加霜.

  因而,动态维护数据库索引文件,将使你的数据库应用程序更有稳定性和可靠性.笔者将以Delphi编程中常用的Paradox数据库为例,介绍数据库索引文件的动态维护.

  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]
  其 中:
  ixPrimary : 建 立 的 索 引 为 主 索 引( 不 适 用 于dBase 数 据 表).
  ixUnique : 不 允 许 重 复 值 的 索 引.
  ixDescending: 按 降 序 索 引.
  ixCaseInsensitive: 索 引 排 序 时 按 忽 略 大 小 写( 不 适 用 于dBase 数 据 表).
  ixExpression: 建 立 表 达 式 索 引( 适 用 于Delphi3.0, 仅 适 用 于dBase 数 据 表).
  ixNonMaintained: 是 否 不 需 要BDE 自 动 维 护( 适 用 于Delphi1.0).

  下 面 是 一 个 例 子:

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

with table1 do
begin
close;
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函数说明:
  RegenIndex,RegenIndexes.
  (4)以上程序在Delphi3.0下测试通过。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章