用Delphi程序維護(hù)Paradox 數(shù)據(jù)表的索引
發(fā)表時(shí)間:2024-02-25 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]在 數(shù) 據(jù) 庫(kù) 編 程 中, 索 引 文 件 對(duì) 于 改 善 數(shù) 據(jù) 查 詢 速 度 有 著 舉 足 輕 重 的 作 用, 充 分 使 用 索 引 文 件 可 以 極 大 改 善 數(shù) 據(jù) 庫(kù) 應(yīng) 用 程 序 的 性 能, 這 一 點(diǎn) 恐 怕 是 難 以 否 認(rèn) 的. 在 應(yīng) 用 過(guò) 程 中, ...
在 數(shù) 據(jù) 庫(kù) 編 程 中, 索 引 文 件 對(duì) 于 改 善 數(shù) 據(jù) 查 詢 速 度 有 著 舉 足 輕 重 的 作 用, 充 分 使 用 索 引 文 件 可 以 極 大 改 善 數(shù) 據(jù) 庫(kù) 應(yīng) 用 程 序 的 性 能, 這 一 點(diǎn) 恐 怕 是 難 以 否 認(rèn) 的.
在 應(yīng) 用 過(guò) 程 中, 用 戶 的 查 詢 條 件 可 能 是 多 種 多 樣 的, 如 果 能 根 據(jù) 用 戶 查 詢 建 立 和 選 擇 索 引, 對(duì) 于 保 證 應(yīng) 用 程 序 的 性 能, 無(wú) 疑 是 很 有 幫 助 的.
另 外, 由 于 停 電 等 意 外 事 故 很 容 易 造 成 數(shù) 據(jù) 庫(kù) 中 的 索 引 文 件 未 及 時(shí) 更 新 甚 至 于 損 壞, 此 時(shí) 如 果 應(yīng) 用 程 序 再 出 幾 個(gè) 錯(cuò) 誤 信 息, 無(wú) 疑 將 使 用 戶 的 處 境 雪 上 加 霜.
因 而, 動(dòng) 態(tài) 維 護(hù) 數(shù) 據(jù) 庫(kù) 索 引 文 件, 將 使 你 的 數(shù) 據(jù) 庫(kù) 應(yīng) 用 程 序 更 有 穩(wěn) 定 性 和 可 靠 性. 筆 者 將 以Delphi 編 程 中 常 用 的Paradox 數(shù) 據(jù) 庫(kù) 為 例, 介 紹 數(shù) 據(jù) 庫(kù) 索 引 文 件 的 動(dòng) 態(tài) 維 護(hù).
Paradox 數(shù) 據(jù) 表 索 引 分 為 主 索 引(Primary Index) 即 關(guān) 鍵 字(Primary Key) 索 引 和 次 索 引(Secondary Index), 其 中 主 索 引 對(duì) 應(yīng).PX 文 件, 次 索 引 對(duì) 應(yīng).XG* 和.YG* 文 件.
一. 創(chuàng) 建 表 索 引
(1) 用Table.AddIndex 來(lái) 實(shí) 現(xiàn)
方 法:AddIndex( IndexName,FieldNames,Options )
其 中:( 詳 見(jiàn)Delphi 幫 助)
IndexName: 索 引 名 稱, 僅 在 指 定 次 索 引 時(shí) 有 作 用.
FieldNames: 索 引 域, 可 指 定 多 個(gè) 域, 各 域 之 間 用 分 號(hào) 隔 開(kāi), 如'Field1;Field2;Field3'
Options: 索 引 選 項(xiàng), 可 為[ixPrimary, ixUnique, ixDescending, ixCaseInsensitive, ixExpression]
其 中:
ixPrimary : 建 立 的 索 引 為 主 索 引( 不 適 用 于dBase 數(shù) 據(jù) 表).
ixUnique : 不 允 許 重 復(fù) 值 的 索 引.
ixDescending: 按 降 序 索 引.
ixCaseInsensitive: 索 引 排 序 時(shí) 按 忽 略 大 小 寫(xiě)( 不 適 用 于dBase 數(shù) 據(jù) 表).
ixExpression: 建 立 表 達(dá) 式 索 引( 適 用 于Delphi3.0, 僅 適 用 于dBase 數(shù) 據(jù) 表).
ixNonMaintained: 是 否 不 需 要BDE 自 動(dòng) 維 護(hù)( 適 用 于Delphi1.0).
下 面 是 一 個(gè) 例 子:
假 設(shè) 有 一 個(gè) 存 放 通 訊 錄 數(shù) 據(jù) 表MyComm.DB( 類 型 為Paradox) 存 放 于 本 地 目 錄d:\mynote 下, 現(xiàn) 建 立 一 個(gè) 主 索 引( 索 引 域 為 編 號(hào)ID) 和 一 個(gè) 次 索 引( 索 引 域 為 編 號(hào)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來(lái)實(shí)現(xiàn)
對(duì)Paradox數(shù)據(jù)表來(lái)說(shuō),用SQL只能建立次索引.
在SQL語(yǔ)法中,用來(lái)建立索引的語(yǔ)句是:
Create Index IndexName On TableName
(IndexField1,IndexField2,..)
其中:
IndexName為一個(gè)次索引的名稱,如MySecIndex1等.
TableName為對(duì)應(yīng)數(shù)據(jù)表的名稱,如MyTable等.
TableName后面為索引域列表,所有索引域有圓括號(hào)括起來(lái),
各索引域之間用逗號(hào)隔開(kāi).
下 面 是 一 個(gè) 例 子:
假 設(shè) 有 一 個(gè) 存 放 通 訊 錄 數(shù) 據(jù) 表MyComm.DB( 類 型 為Paradox) 存 放 于 本 地 目 錄
d:\mynote 下, 現(xiàn) 建 立 一 個(gè) 次 索 引( 索 引 域 為 編 號(hào)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 來(lái) 實(shí) 現(xiàn)
DeleteIndex 只 能 刪 除 次 索 引 名 稱.
方 法:DeleteIndex( IndexName )
其 中:( 詳 見(jiàn)Delphi 幫 助)
IndexName: 次 索 引 名 稱.
下 面 是 一 個(gè) 例 子:
假 設(shè) 有 一 個(gè) 存 放 通 訊 錄 數(shù) 據(jù) 表MyComm.DB( 類 型 為Paradox) 存 放 于 本 地 目 錄
d:\mynote 下, 現(xiàn) 有 一 個(gè) 次 索 引( 索 引 域 為 編 號(hào)ID 和 姓 名Name, 索 引 名 稱 為NameIndex), 將 刪 除 之.
with table1 do
begin
close;
Exclusive := true;
DatabaseName := 'd:\MyNote';
TableName := 'MyComm.DB';
Open;
{刪除次索引}
DeleteIndex('NameIndex');
close;
end;
(2) 用SQL 來(lái) 實(shí) 現(xiàn)
在SQL 語(yǔ) 法 中, 用 來(lái) 刪 除 索 引 的 語(yǔ) 句 是:
Drop Index TableName.IndexName
要 刪 除 次 索 引 時(shí),IndexName 為 一 個(gè) 次 索 引 的 名 稱, 如'MyTable.MySecIndex1' 等.
要 刪 除 主 索 引 時(shí),IndexName 為'primary', 如'MyTable.primary'; 值 得 注 意 的 是, 在 刪 除 主 索 引 成 功 后, 數(shù) 據(jù) 表 的 所 有 次 索 引 也 自 動(dòng) 刪 除.
下 面 是 一 個(gè) 例 子:
假 設(shè) 有 一 個(gè) 存 放 通 訊 錄 數(shù) 據(jù) 表MyComm.DB( 類 型 為Paradox) 存 放 于 本 地 目 錄
d:\mynote 下, 已 定 義 一 個(gè) 主 索 引( 索 引 域 為 編 號(hào)ID) 和 一 個(gè) 次 索 引( 索 引 域 為 編 號(hào)ID 和 姓 名Name, 索 引 名 稱 為NameIndex).
現(xiàn) 在 因 為 索 引 損 壞, 要 刪 除 索 引, 以 便 重 新 索 引.
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;
三. 注 意 事 項(xiàng):
(1) 在 索 引 更 改 時(shí), 應(yīng) 保 證 對(duì) 應(yīng) 的 數(shù) 據(jù) 表 可 以 以 獨(dú) 占 方 式(Exclusive=true) 打 開(kāi), 否 則 會(huì) 引 起 錯(cuò) 誤.
(2) 上 述 方 法 略 加 修 改 后, 也 可 用 于dBase,Oracle 等 其 它 數(shù) 據(jù) 庫(kù) 的 數(shù) 據(jù) 表.
(3) 如 果 需 要 重 新 對(duì) 索 引 文 件 進(jìn) 行 索 引, 請(qǐng) 參 考BDE 的Dbi 函 數(shù) 說(shuō) 明:
RegenIndex, RegenIndexes.
(4) 以 上 程 序 在Delphi3.0 下 測(cè) 試 通 過(guò)。