460 likes | 573 Views
第四章 数据库与表的基本操作. 本 章 内 容. §4.1 数据库的基本操作 §4.2 表的基本操作 §4.3 表的索引 §4.4 数据完整性 §4.5 多表操作. §4.3 表的索引. 表中记录的存储顺序由数据输入的前后顺序决定,以 记录号 标识,称为记录的 物理顺序 。执行 LIST 命令就可以看到刻录号。 索引是 根据 表中的某些 字段或表达式 的值,建立一个按 逻辑顺序 排列记录的索引文件。 索引不改变表中记录的物理顺序,而是另外建立一个基于索引表达式值的记录号列表。
E N D
第四章 数据库与表的基本操作 本 章 内 容 §4.1 数据库的基本操作 §4.2 表的基本操作 §4.3 表的索引 §4.4 数据完整性 §4.5 多表操作
§4.3 表的索引 表中记录的存储顺序由数据输入的前后顺序决定,以记录号标识,称为记录的物理顺序。执行LIST命令就可以看到刻录号。 索引是根据表中的某些字段或表达式的值,建立一个按逻辑顺序排列记录的索引文件。 索引不改变表中记录的物理顺序,而是另外建立一个基于索引表达式值的记录号列表。 索引可以加快查找的速度;此外,如果要建立表间联系,则必须先对建立联系的字段建立索引。
§4.3.1 索引的类型 VFP提供了4种类型的索引:主索引、候选索引、普通索引和惟一索引。 1.主索引 作为主索引的关键字值是惟一的,不允许重复。表中可能不只一个字段能惟一地确定一条记录,但一个表只能有一个主索引,只有数据库表才能建立主索引,自由表不能建立主索引。主索引通常作为“一对一”或“一对多”联系的“一方”。 2.候选索引 候选索引的关键字值也必须是惟一的,一个表可以建立多个候选索引,数据库表和自由表都可以建立候选索引。当数据库表无主索引时,可以指定一个候选索引作为“一对一”或“一对多”联系的“一方”。 例如,假设在“学生档案.dbf”表中,有“身份证号”及“学号”字段,可将“身份证号”字段设置为主索引,将“学号”字段设置为候选索引。
3.普通索引 普通索引允许关键字出现重复值,数据库表和自由表都可以建立普通索引,一个表可以建立多个普通索引。普通索引通常作为“一对多”联系的“多方”。 4.惟一索引 惟一索引是指索引项惟一,但允许索引关键字值不惟一,当出现重复值时,只有第一个关键字值的记录有效,而忽略其他重复值的记录。惟一索引是为了兼容早期的版本而设置的。
§4.3.2 索引文件的类型 索引文件的类型是关于索引存储的问题。 结构化复合索引文件 复合索引文件 (与表文件同名,自动打开和维护) (.CDX) 非结构化复合索引文件 索引文件 (与表文件不同名,不能自动打开和维护) 独立索引文件(.IDX) (文件名由用户指定,不能自动打开和维护) 1.复合索引文件 复合索引文件是包含一个或多个索引的文件,其扩展名为.CDX。 复合索引文件又分为结构化复合索引文件(与表文件同名)和非结构化复合索引文件(与表文件不同名)。
表文件打开时,结构化复合索引文件随之自动打开,表文件关闭时,结构化复合索引文件随之关闭。表文件打开时,结构化复合索引文件随之自动打开,表文件关闭时,结构化复合索引文件随之关闭。 非结构化复合索引文件与表不同名,其名称由用户指定。只有指定其名称才能打开非结构化复合索引文件。 2.独立索引文件 独立索引文件只存放一个索引,其扩展名为.IDX。 独立索引文件的名称由用户定义;一个表文件可以建立多个独立索引文件;独立索引文件不会随着表文件打开而自动打开。
3.索引文件的小结 “复合”是指一个索引文件中包含多个索引(索引不是文件)。“独立”是指一个索引文件中只包含一个索引(每个索引都是文件) 。VFP默认使用结构化复合索引文件,非结构化复合索引文件几乎没有用到。独立索引文件是早期版本的数据库管理系统的索引文件,VFP为了兼容早期版本的数据库管理系统而保留了独立索引文件。结构化复合索引文件是索引文件应用的重点 4.索引的数据更新 若表文件打开,索引文件也打开,表数据的更新会反映到索引中,从而保证表与索引的数据同步匹配。若表文件打开,索引文件没有打开,表数据的更新不会反映到索引中,从而导致表与索引数据不相匹配。 鉴于以上理由,VFP 6.0默认将建立的索引存放在结构化复合索引文件中。在“表设计器”中建立的索引是结构化复合索引文件。
§4.3.3 在“表设计器”中创建索引 1.建立单关键字索引 【例4-15】在职工简况表Zgjk.dbf中,建立三个索引。“职工号”为“主索引”,按升序排列;“出生日期”为“普通索引”,按降序排列;“基本工资”为“普通索引”,按升序排列。 操作步骤如下: (1)打开职工简况表Zgjk.dbf。 (2)打开“表设计器”,并选择“字段”选项卡,单击“职工号”字段,在索引下拉列表中选择“升序”。用同样的方法设置“出生日期”字段为降序索引,“基本工资”字段为升序索引,如图4-35所示。 图4-35 “表设计器”的“字段”选项卡
(3)在“表设计器”中,选择“索引”选项卡,出现“索引”页面。单击“职工号”字段,并单击“类型”右侧的下拉按钮,在类型下拉列表中选择“主索引”。用同样的方法设置“出生日期”字段和“基本工资”字段的索引类型为普通索引,如图4-36所示。 “职工号”、“出生日期”和“基本工资”3个索引存放在一个与表文件同名结构化复合索引文件Zgjk.cdx中。 图4-36 “表设计器”的“索引”选项卡
2.建立多关键字复合索引 多关键字复合索引是按照表达式的值排序,而不是按照单个字段的值排序。记录按照字段在表达式中出现的顺序排列。 【例4-16】在职工简况表Zgjk.dbf中,建立“部门”和“基本工资”两个字段的复合索引,索引名称为:部门工资,要求先按“部门”降序排列,当“部门”相同时,按“基本工资”降序排列。 (1)建立多关键字复合索引 操作步骤如下。 1)打开职工简况表Zgjk.dbf。 2)打开“表设计器”的“字段”选项卡,选择“部门”字段,并单击“索引”右侧的下拉按钮,在类型下拉列表中选择“降序”。 3)选择“索引”选项卡中,选择“部门”字段,单击“类型”右侧的下拉按钮,在类型下拉列表中选择“普通索引”。
4)单击表达式右侧的按钮,打开“表达式生成器”对话框。在“表达式”框中输入:4)单击表达式右侧的按钮,打开“表达式生成器”对话框。在“表达式”框中输入: 部门+STR(基本工资 , 7 , 2),如图4-37所示。 图4-37 “表达式生成器”对话框
5)单击“确定”按钮,返回“表设计器”,输入索引名称:部门工资,如图4-38所示。索引名称可由用户自定义,不一定要与表达式同名。5)单击“确定”按钮,返回“表设计器”,输入索引名称:部门工资,如图4-38所示。索引名称可由用户自定义,不一定要与表达式同名。 图4-38 “表设计器”对话框 6)单击“确定”按钮,关闭“表设计器”。
3.设置主控索引 表文件打开后,结构化复合索引文件自动打开,但是其中的索引没有起作用,表记录仍然按记录号的物理顺序显示。这是因为结构化复合索引文件中包含多个索引,要指定主控索引后,记录才按指定的主控索引的逻辑顺序显示。 (1)使用“工作区属性”对话框指定主控索引 1)打开职工简况表Zgjk.dbf。 2)单击工具栏中的“数据工作期窗口”按钮 ,打开“数据工作期窗口”,如图4-40所示。 图4-40 “数据工作期窗口”
3)单击“属性”按钮,打开“工作区属性”对话框,如图4-41所示。单击“索引顺序”列表框的下拉按钮,在弹出的列表中选择索引标识“Zgjk.部门工资”。(其中,<无顺序>就是物理顺序。)3)单击“属性”按钮,打开“工作区属性”对话框,如图4-41所示。单击“索引顺序”列表框的下拉按钮,在弹出的列表中选择索引标识“Zgjk.部门工资”。(其中,<无顺序>就是物理顺序。) 图4-41“工作区属性”对话框
4)单击“确定”按钮,关闭“工作区属性”对话框。4)单击“确定”按钮,关闭“工作区属性”对话框。 5)选择“显示”菜单中的“浏览”命令,打开“浏览”窗口,如图4-41所示。 图4-41 “浏览”窗口
§4.3.4 表的索引命令 1.建立索引 格式:INDEX ON <索引表达式> TO <独立索引文件>[.IDX] |TAG <索引标记> [OF <复合索引文件>] [.CDX] [FOR <条件>] [ASCENDING | DESCENDING] 功能:对当前的表文件,按<索引表达式>的值建立索引文件。 说明: (1)ASCENDING或DESCENDING:指定索引按升序或降序排列,默认升序。 (2)建立结构化复合索引文件的命令格式为: INDEX ON <索引表达式> TAG <索引标记> (3)建立独立索引文件的命令格式为: INDEX ON <索引表达式> TO <独立索引文件>
【例4-18】在职工简况表Zgjk.dbf中,使用命令建立“部门”和“基本工资”两个字段的复合索引,索引名称为:部门工资,要求先按“部门”降序排列,当“部门”相同时,按“基本工资”降序排列。【例4-18】在职工简况表Zgjk.dbf中,使用命令建立“部门”和“基本工资”两个字段的复合索引,索引名称为:部门工资,要求先按“部门”降序排列,当“部门”相同时,按“基本工资”降序排列。 在命令窗口中,键入以下命令并执行。 USE Zgjk &&打开职工简况表 INDEX ON 部门+STR(基本工资,7,2) TAG 部门工资 DESC &&建立复合索引 BROWSE &&在浏览窗口中显示表记录
2.设置主控索引 命令格式:SET ORDER TO [TAG] <索引标记> 功能:将指定的索引设置为主控索引。 【例4-19】使用命令指定职工简况表Zgjk.dbf中的“基本工资”索引为主控索引,然后按照索引的逻辑顺序列出表记录。 在命令窗口中,键入以下命令并执行。 USE Zgjk &&打开职工简况表 SET ORDER TO 部门工资 &&设置主控索引 LIST &&显示表记录
§4.3.5 数据检索 索引目的是建立表间联系和加快数据检索。数据检索的本质是将记录指针定位到目标记录,并没有显示记录数据的内容。找到目标记录后,还要使用DISP命令,才能看到目标记录的内容。常用的数据检索命令有:SEEK、FIND和LOCATE。 SEEK和FIND命令是索引检索,也就是说,在使用SEEK和FIND命令之前要先索引。LOCATE命令是条件检索。
1.索引检索 (1)SEEK命令 格式:SEEK <表达式> 功能:将记录指针移到与<表达式>值相匹配的记录。 说明: 1)要先索引后检索。 2)SEEK命令中的<表达式>与索引表达式必须相同。 【例4-20】在职工简况表中,使用SEEK命令查找并显示家电部门的职工信息。 USE Zgjk INDEX ON 部门TAG 部门 &&刚建的索引是打开的 SEEK "家电"&&若缺省双引号,家电将被理解为变量名 DISP &&显示第1个目标记录内容 SKIP &&指针移到下一个目标记录 DISP &&显示第2个目标记录内容
(2)FIND命令 格式:FIND <字符串>|<常数> 功能:将记录指针移到与<字符串>或<常数>值 相匹配的记录。 说明: 1)要先索引后检索。 2)FIND命令中的<字符串>或<常数>与索引表达式必须相同。 3)FIND命令中<字符串>定界符可省略。 4)由于SEEK命令的功能全面覆盖FIND命令的功能。一些书籍不再介绍FIND命令。
【例4-21】在职工简况表中,使用FIND命令查找并显示家电部门的职工信息。【例4-21】在职工简况表中,使用FIND命令查找并显示家电部门的职工信息。 USE Zgjk SET ORDER TO 部门 &&指定主控索引 FIND 家电 &&字符串定界符可省略 DISP&&显示第1个目标记录 SKIP&&指针下移到下一个目标记录 DISP&&显示第2个目标记录
2.条件定位 格式:LOCATE [范围] [FOR|WHILE <条件>] CONTINUE 功能:LOCATE命令将记录指针定位在满足条件的第一个目标记录。CONTINUE命令将记录指针指向下一条满足条件的目标记录。 说明: (1)若缺省范围子句,则默认ALL。 (2)若没有满足条件的记录,则记录指针指向文件结束位置。
【例4-22】在职工简况表中,查找1981年出生的职工信息。【例4-22】在职工简况表中,查找1981年出生的职工信息。 USE Zgjk LOCATE FOR YEAR(出生日期)=1981 &&指针定位到第1个目标记录 DISP&&显示第1个目标记录 CONTINUE&&指针定位到下一个目标记录 DISP&&显示第2个目标记录 ? RECNO() , EOF() 9 .T.
§4.4 数据完整性 §4.4.1 实体完整 1.实体完整性的概念 实体完整性即表中记录的惟一性,在VFP中通过主关键字或候选关键字保证记录的惟一,即保证实体完整性。 实体完整性是通过在“表设计器”的“字段”选项卡中设置主关键字段的字段有效性来实现的。 2 .设置实体完整性 【例4-23】使用命令制作职工简况表Zgjk.dbf(“职工号”字段已设置为主关键字)的副本Zgjk3.dbf;创建数据库:职工2.dbc,将Zgjk3.dbf表添加到数据库中;打开数据库表Zgjk3.dbf,设置“显示”选项组,要求:“职工号”字段不能为空,否则将弹出提示信息:主关键字不能为空!。
在命令窗口中,键入以下命令并执行。 USE Zgjk COPY TO Zgjk3 &&将当前表文件拷贝到Zgjk3.dbf CREATE DATABASE 职工2 &&创建数据库文件 ADD TABLE Zgjk3 &&向当前数据库添加表文件 USE Zgjk3 &&打开表文件 MODIFY STRUCTURE &&修改表结构 执行上述命令,可以看到:数据库表比自由表的“表设计器”具有更多的选项。其中,“显示”、“字段有效性”、“匹配字段类型到类”和“字段注释”是数据库表的“表设计器”所特有的四个选项组。
(1)在“表设计器”的“字段”选项卡中,选定“职工号”字段。(1)在“表设计器”的“字段”选项卡中,选定“职工号”字段。 (2)在“字段有效性”选项组的“规则”框中输入: .NOT.EMPTY(职工号) (3)在“信息”框中输入:"主关键字不能为空!",如图4-43所示。 当输入的数据记录违反字段有效性规则的时,显示出错提示信息。 图4-43 设置实体完整性
§4.4.2 域完整性 域完整性是指字段取值的合理性。建立表结构时,定义了字段的类型和宽度,但这不能保证字段取值的合理性。域的约束规则也称为字段有效性规则。 1.设置域完整性 域完整性在“表设计器”的“字段”选项卡中设置。 【例4-24】打开数据库表Zgjk3.dbf,设置基本工资的值不少于0。若违反规则,则提示:基本工资不小于零!。 操作步骤如下。 (1)打开数据库表Zgjk3.dbf。 (2)选择“显示”菜单中的“表设计器”命令,打开“表设计器”的“字段”选项卡。
(3)选定“基本工资”,在“字段有效性”选项组的“规则”框中输入:基本工资>=0。 (4)在“信息”框中输入:"基本工资不小于零!",如图4-43所示。 (5)单击“确定”按钮,关闭“表设计器”,保存所作的设置。 图4-43 设置域完整性
2.设置字段默认 设置字段默认可以减少记录数据的录入量。 【例4-25】职工简况表Zgjk3.dbf中,大多数职工已婚。为了减少记录数据的录入量,将“婚否”字段的默认值设置为.T.。 操作步骤如下。 (1)打开数据库表Zgjk3.dbf。 (2)选择“显示”菜单中的“表设计器”命令,打开“表设计器”的“字段”选项卡。 (3)选定“婚否”字段,在“字段有效性”选项组的“默认值”框中输入:.T. ,如图4-44所示。 图4-44 设置字段默认值
§4.4.3 参照完整性与表间联系 1.表间联系类型 (1)永久联系 在“数据库设计器”中建立的表间联系为永久联系,永久联系作为数据库的对象长期保存在数据库中,随着数据库打开而打开,关闭而关闭。永久联系主要用于检查数据库表间参照完整性和设置数据库环境。永久联系不能实现不同工作区中表的记录指针的联动。 (2)临时联系 临时联系是在VFP运行期间,使用“窗口”菜单中的“数据工作期”命令或SET RELATION命令建立的联系。临时联系随着数据库关闭而取消。临时联系能够实现不同工作区中表的记录指针的联动。
2 .创建表间永久联系 创建表间联系的步骤是:先建立两个表的联系字段的索引,然后在“数据库设计器”窗口中,建立表间联系。 (1)建立联系字段的索引 为了建立数据库表之间的联系,首先要在各个表中建立联系字段的索引。 若要建立两表之间的一对一联系,两个表的联系字段必须是主索引或者候选索引(具有惟一性)。 若要建立两表之间的一对多联系,作为“一”方的父表的索引必须是主索引或者候选索引(具有惟一性),作为“多”方的子表的索引必须是普通索引(允许出现重复值)。
(2)建立表间联系 在“数据库设计器”窗口中,打开“职工业绩”数据库。 按住鼠标左键把一个表的索引拖放到另一个表的索引上,两表之间就出现了一条关系连线,其中不带分岔的一端表示联系中的“一”方,带有三分岔的一端表示联系中的“多”方,如图4-45所示。 图4-45 建立表间永久联系
(3)编辑表间联系 1)鼠标左键单击表之间的连线,连线变粗,表示选定了该连线。 2)鼠标右键单击选定的连线,弹出快捷菜单。 3)若选择“删除关系”命令,则取消表间的联系;若选择“编辑关系”命令,则打开“编辑关系”对话框。
2.设置参照完整性 数据库表建立了表间永久联系后,表之间的记录就存在一定的联系。 设置参照完整性是为了控制表之间的记录一致性。当修改、删除、插入记录时,如果建立了参照完整性,VFP将检查操作的合法性,以保持已建立的表间联系的正确性。 设置参照完整性的步骤如下: (1)在各个数据库表中建立联系字段的索引。 (2)建立数据库表之间的永久联系。 (3)清理数据库。 执行“数据库”菜单中的“清理数据库”命令,物理删除数据库各个表中所有带有删除标记的记录。
(4)设置参照完整性的约束条件 鼠标右击表间连线,在弹出的快捷菜单中选择“编辑参照完整性”命令,打开“编辑参照完整性生成器”对话框,如图4-46所示。 分别在“更新规则”、“删除规则”和“插入规则”选项卡中,设置“级联则”、“限制”或“忽略”。当进行记录的修改、删除和插入操作时,VFP根据参照完整性作出的合法性检查。 图4-46 “参照完整性生成器”对话
§4.5 多表操作 §4.5.1 工作区的概念 1.工作区基本概念 (1)VFP允许在内存中开辟32767个工作区。 (2)每一个工作区只能打开一个表文件。 (3)系统默认在第1工作区打开表文件。第1工作区又称为主工作区。 2.工作区的区号与别名 (1)区号分别为1~32767,区号0为最小空闲工作区。 (2)别名有3种: 1)系统别名为A、B、C、D、E、F、G、H、I、J和W11~W32767; 2)用户指定的别名; 3)当用户没有指定表的别名时,就以表的原名作为别名。
3.在指定的工作区打开表并指定别名 (1)格式:USE <表名> IN <区号> ALIAS <别名> (2)功能:在指定的工作区打开表文件,并指定用户别名。 (3)说明:表文件刚打开时,指针指向首记录。 【例4-26】在指定的工作区打开表文件,并指定表文件的别名。 在命令窗口中键入: USE Zgjk IN 1 ALIAS ZG &&在1区打开Zgjk表,并指定其别名为ZG USE Gz IN 2 &&在2区打开GZ表 注意:当前工作区是1区,而不是2区。
4.选择当前工作区 (1)命令格式:SELECT <区号>|<别名> (2)功能:将指定的工作区作为当前工作区。 【例4-27】选定当前工作区,然后在当前工作区打开表文件,并为其指定别名。 在命令窗口中键入: SELECT 1 &&选择1区为当前区 USE Zgjk ALIAS ZG &&在当前区(1区)打开Zgjk表,并指定别名ZGSELECT 2 &&选择2区为当前区,也可以用SELECT B或SELECT 0 USE Gz &&在当前区(2区)打开GZ表 注意:当前工作区是2区。
§4.5.2 建立表间临时联系 1.建立表间临时联系 (1)选择“窗口”菜单中的“数据工作期”命令,打开“数据工作期”窗口,如图4 -47所示。 图4-47 “数据工作期”窗
(2)单击“打开”按钮,弹出“打开”对话框。 (3)在“打开”对话框中,选定一个表文件,如选定Zgjk表,然后单击“确定”按钮,返回“数据工作期”窗口,Zgjk表即添加到“别名”列表框中。重复以上的步骤将Gz表添加到“别名”列表框中,如图4-46所示。 (4)在“数据工作期”窗口的“别名”列表框中,选定父表Zgjk,然后单击“关系”按钮,在“关系”列表框中出现父表Zgjk,其下还有一根折线。 (5)在“别名”列表框中,单击子表Gz,打开“设置索引顺序”对话框,如图4-49所示。 图4-49 “设置索引顺序”对话框
(6)双击作为联系的索引关键字段“Gz:职工号”,打开“表达式生成器”对话框,如图4-50所示。 (7)单击“确定”按钮,返回“数据工作期”窗口,如图4-51所示。 图4-50 “表达式生成器”对话框 图4-51 建立了临时联系的“数据工作期”窗口
2.记录指针联动 建立了表间临时联系后,不同工作区中表的记录指针按联系关键字的值同步移动。 (1)在“数据工作期”窗口的“别名”列表框中,选定Zgjk表,然后单击“浏览”按钮;再选定Gz表,然后单击“浏览”按钮。 (2)在父表Zgjk的浏览窗口中,单击记录定位标记,选定“职工号”为“0202”的职工。在Gz表中自动显示“职工号”为“0202”的职工的工资信息,如图4-52所示。 注意:临时联系是有方向的,由父表带动子表移动指针。 图4-52 两表记录指针同步联动
3.表间临时关联的操作命令 (1)建立表间临时关联 格式:SET RELATION TO <关键字表达式> INTO <区号>|<别名> 功能:按关键字表达式的值建立当前表与指定的表 的关联。 说明:被关联的子表的关键字表达式需要索引。 (2)取消当前表到所有表的关联 格式:SET RELATION TO (3)取消当前表到指定表的关联 格式:SET RELATION OFF INTO <区号> | <别名>
【例4-28】使用命令建立职工简况Zgjk.dbf表与工资Gz.dbf表之间的临时关联,并计算出实发工资。 USE Zgjk IN 1 &&在1区打开Zgjk表 USE Gz IN 2 ORDER 职工号 &&在2区打开GZ表及“职工号”索引 *注意1区是当前工作区 *以下命令是建立从1区的父表Zgjk到2区的子表Gz的临时关联 SET RELATION TO 职工号 INTO Gz &&也可以用INTO B BROWSE &&浏览1区的Zgjk表 SELECT 2 &&选择2区为当前区 BROWSE &&浏览2区的Gz表 SELECT 1 &&临时关联记录指针联动是单向的,父表带动子表 REPLACE ALL B.实发工资 WITH; 基本工资+B.岗位工资+B.津贴+B.奖金-B.住房公积金-B.工会费
SELECT 2 BROWSE 两表关联替换结果如图4-53所示。 图4-53 两表关联替换结果 说明:若要引用非当前区表的字段,则要在字段名前冠以工作区号或表的别名,由于“岗位工资”、“津贴”、“奖金”、“住房公积金”和“工会费”是非当前区表的字段,所以要冠以工作区号或表的别名 。