
计算机软件及应用第三章数据库表.ppt
58页[计算机软件及应用]第三章数据库表[计算机软件及应用]第三章-数据库表3.4 索引文件及其应用索引文件及其应用n3.4.1 索引文件及分类n1. n索引文件:它仅由两个字段组成,一个字段是排序的关键字值(也可以是一个表达式),另一个字段是每个关键字在原始数据表中对应的记录号例,在数据表中,以编号为关键字段并按升序建立的索引文件的示意图如下图所示n1. 索引文件索引文件n原数据表中的顺序是按输入的顺序存储在表中的,在索引文原数据表中的顺序是按输入的顺序存储在表中的,在索引文件中,记录是按索引关键字值的顺序排列的,当要查找某一件中,记录是按索引关键字值的顺序排列的,当要查找某一编号的记录时,编号的记录时,VFP先在索引文件中查找该编号,找到后先在索引文件中查找该编号,找到后再根据对应的记录号,在数据表中将记录指针快速移动再根据对应的记录号,在数据表中将记录指针快速移动到该记录上到该记录上 n一个索引文件中可以只有一个索引,也可以有多个索引可以一个索引文件中可以只有一个索引,也可以有多个索引可以包含多个索引的索引文件称该文件为复合索引文件在复合索包含多个索引的索引文件称该文件为复合索引文件。
在复合索引文件中,需要为每个索引指定一个索引标识名,以便于通过引文件中,需要为每个索引指定一个索引标识名,以便于通过索引标识相互区分各个索引索引标识相互区分各个索引 3.4.1 索引文件及分类n2. 索引文件的分类索引文件的分类nVFP支持传统的单入口索引文件(扩展名为支持传统的单入口索引文件(扩展名为.IDX)和复合)和复合索引文件(扩展名索引文件(扩展名.CDX),其中),其中.IDX索引文件中只包含索引文件中只包含一个索引,而一个索引,而.CDX索引文件中可以包含有一个或多个索索引文件中可以包含有一个或多个索引,所以称为复合索引文件引,所以称为复合索引文件n复合索引文件,又可分为结构化复合索引文件和非结构化复复合索引文件,又可分为结构化复合索引文件和非结构化复合索引文件两种,其区别在于:结构化复合索引的主文件名合索引文件两种,其区别在于:结构化复合索引的主文件名与数据表的主文件名相同,并随着数据表的打开而打开,在与数据表的主文件名相同,并随着数据表的打开而打开,在添加、更改或删除记录时会自动进行维护;而非结构化复合添加、更改或删除记录时会自动进行维护;而非结构化复合索引文件的主文件名与数据表文件不同,必须用命令打开。
索引文件的主文件名与数据表文件不同,必须用命令打开 3.4.1 索引文件及分类n3. 索引的类型索引的类型n(1)主索引主索引n主索引通常是数据表的关键字索引,作为主索引的字段主索引通常是数据表的关键字索引,作为主索引的字段称为主关键字主索引不能用在自由表中,而只能用在称为主关键字主索引不能用在自由表中,而只能用在数据库表中,可用于在永久关系中建立参照完整性创数据库表中,可用于在永久关系中建立参照完整性创建主索引的字段不允许有重复值,且一个表只能有一个建主索引的字段不允许有重复值,且一个表只能有一个主索引n例如,在数据表中,常用学生证号、身份证号、工例如,在数据表中,常用学生证号、身份证号、工作证号等作为主索引,而姓名可能有同名的情况,作证号等作为主索引,而姓名可能有同名的情况,一般不能作为主索引一般不能作为主索引 3.4.1 索引文件及分类n3. 索引的类型索引的类型n(2)候选索引候选索引n候选索引类似于主索引,其索引值就不能有重复值与主候选索引类似于主索引,其索引值就不能有重复值与主索引不同的是,一个数据表中可以有多个候选索引,而且索引不同的是,一个数据表中可以有多个候选索引,而且侯选索引不能用来在永久关系中建立参照完整性。
侯选索引不能用来在永久关系中建立参照完整性n(3)惟一索引惟一索引n惟一索引表示索引值只能取一个,如果有两个或两惟一索引表示索引值只能取一个,如果有两个或两个以上的索引值,则只能取其中一个,因此,惟一个以上的索引值,则只能取其中一个,因此,惟一索引使用时可能会隐藏一些记录例如,若有两个索引使用时可能会隐藏一些记录例如,若有两个同名的人员,将姓名字段作为惟一索引,则只能找同名的人员,将姓名字段作为惟一索引,则只能找到一个记录,另一个记录将不会找到到一个记录,另一个记录将不会找到3.4.1 索引文件及分类n3. 索引的类型索引的类型n(4)普通索引普通索引n普通索引没有上面各索引的限制,是普通索引没有上面各索引的限制,是允许重复索引值的索引作为普通索允许重复索引值的索引作为普通索引的字段,其字段值可以重复,也可引的字段,其字段值可以重复,也可以作为排序的依据,但因为可能有多以作为排序的依据,但因为可能有多个相同的索引值,因此查询时会找到个相同的索引值,因此查询时会找到多个符合条件的记录一个数据表中多个符合条件的记录一个数据表中可以有多个普通索引可以有多个普通索引3.4.2 创建索引文件n1. 建立结构化复合索引文件建立结构化复合索引文件n(1) 在表设计器中创建索引文件在表设计器中创建索引文件n(2) 命令方式创建索引n【格式格式】INDEX ON <表达式> TAG <索引标识名> [FOR <条件表达式>]n [ASCENDING|DESCENDING][UNIQUE|CANDIDATE][ADDITIVE]n【【功能功能】】建立结构化复合索引文件。
建立结构化复合索引文件nUSE RSDAn INDEX ON 编号编号 TAG NBH CANDn INDEX ON 性别性别+CTOD(出生日期出生日期) TAG XBCSRQ n2. 建立独立复合索引文件建立独立复合索引文件n独立复合索引文件的扩展名也是独立复合索引文件的扩展名也是.CDX,但其主文件名与数据表文件名,但其主文件名与数据表文件名不相同,且使用时还需单独打开独立复合索引文件主要用来创建那不相同,且使用时还需单独打开独立复合索引文件主要用来创建那些使用不太频繁的索引些使用不太频繁的索引n独立复合索引文件不能在表设计器中创建,命令建立独立复合索引文件不能在表设计器中创建,命令建立n【【格式格式】】INDEX ON <表达式> TAG <索引标识名> OF <独立复合索引文件名>n [FOR <条件表达式>=[ASCENDING|DESCENDING]n [UNIQUE|CANDIDATE][ADDITIVE]nUSE RSDAn INDEX ON 编号编号 TAG bh OF n INDEX ON 姓名姓名+STR(职务补贴职务补贴) TAG xbbt OF n3. 重新建立索引文件重新建立索引文件n在数据表的使用过程中,当增删记录或数据表中被索引文件在数据表的使用过程中,当增删记录或数据表中被索引文件使用的关键字段改动时,结构化复合索引会随着数据表的打使用的关键字段改动时,结构化复合索引会随着数据表的打开自动打开并能及时得到更新,但如果在使用数据表时未打开自动打开并能及时得到更新,但如果在使用数据表时未打开相应的独立复合索引文件或传统的单入口开相应的独立复合索引文件或传统的单入口.IDX索引文件,索引文件,则索引文件会因为无法及时更新而产生错误索引。
这时须打开则索引文件会因为无法及时更新而产生错误索引这时须打开索引文件,并对其重新索引索引文件,并对其重新索引n重执行一遍重执行一遍INDEX命令即可重新索引,更简捷的方法命令即可重新索引,更简捷的方法是在浏览窗口中打开数据表,然后选择菜单是在浏览窗口中打开数据表,然后选择菜单“表表”、、“重建建立索引重建建立索引”命令,或打开数据表后用命令,或打开数据表后用REINDEX命令重新建立索引命令重新建立索引n【【格式格式】】REINDEX3.4.3 索引文件的使用n1. 指定主控索引指定主控索引n一个数据表可以建立多个索引文件,每个索引文件中一个数据表可以建立多个索引文件,每个索引文件中又可能包含多个索引,而一种索引就是一种排序方式,又可能包含多个索引,而一种索引就是一种排序方式,所以,在使用索引时,必须指明哪一个索引是对数据所以,在使用索引时,必须指明哪一个索引是对数据表记录排序起作用的,即指定主控索引在没有指定表记录排序起作用的,即指定主控索引在没有指定哪一个索引为主控索引之前,数据表的访问顺序仍然哪一个索引为主控索引之前,数据表的访问顺序仍然是原来的物理顺序,即按记录号的顺序访问。
是原来的物理顺序,即按记录号的顺序访问n主控索引和主索引是完全不同的概念主索引是主控索引和主索引是完全不同的概念主索引是用来控制数据的完整性的,而主控索引是用来指用来控制数据的完整性的,而主控索引是用来指定目前记录排列顺序的定目前记录排列顺序的 1. 指定主控索引指定主控索引n(1) 指定结构化复合索引文件中的索引为主控索引指定结构化复合索引文件中的索引为主控索引n在浏览窗口中打开数据表(以表为例),选择菜单在浏览窗口中打开数据表(以表为例),选择菜单“表表”、、“属性属性”命令,即弹出命令,即弹出“工作区属性工作区属性”对话框,单对话框,单击击“索引顺序索引顺序”下拉列表,选择一个索引标识名下拉列表,选择一个索引标识名 ,浏览窗浏览窗口中记录的排列顺序会立即根据选择的主控索引发生变口中记录的排列顺序会立即根据选择的主控索引发生变化化 n设定主控索引后,利用设定主控索引后,利用LIST、、DISPLAY命令输出的记命令输出的记录顺序也是排序后的顺序录顺序也是排序后的顺序n需要特别强调的是,主控索引只是改变了记录的输出顺序,需要特别强调的是,主控索引只是改变了记录的输出顺序,记录在数据库中的顺序并没有发生变化。
记录在数据库中的顺序并没有发生变化 n通过通过VFP的的USE命令和命令和SET ORDER TO命令也可以指定主控索命令也可以指定主控索引n【【格式一格式一】】USE <数据表名> ORDER [TAG] <索引标识名>n [ASCENDING|DESCENDING]n【【格式二格式二】】SET ORDER TO [[TAG] <索引标识名>] [ ASCENDING|DESCENDING]n【【功能功能】】指定结构化复合索引文件的索引为主控索引指定结构化复合索引文件的索引为主控索引n(2) 指定独立复合索引文件中的索引为主控索引指定独立复合索引文件中的索引为主控索引n对于独立的复合索引文件或单入口的索引文件,需要用命令对于独立的复合索引文件或单入口的索引文件,需要用命令将其打开和关闭,只有打开要使用的独立复合索引文件后,将其打开和关闭,只有打开要使用的独立复合索引文件后,才能指定其中的索引为主控索引才能指定其中的索引为主控索引n【【格式一格式一】】USE <数据表名> ORDER [TAG] <索引标识名> n [OF <独立复合索引文件名>] [ASCENDING|DESCENDING]n【【格式二格式二】】SET INDEX TO [TAG] <索引标识名> [OF <独立复合索引文件名>]n(4) 关闭索引文件关闭索引文件n【【格式一格式一】】SET INDEX TOn【【格式二格式二】】CLOSE INDEXn2. 控制重复值控制重复值n人事档案人事档案Rsda表中的编号字段,是用来惟一标识表中的编号字段,是用来惟一标识一位职工的,所以该字段的值是不允许重复的。
利一位职工的,所以该字段的值是不允许重复的利用主索引可以解决这个问题,只要为编号字段建立用主索引可以解决这个问题,只要为编号字段建立索引,并将索引类型设置为主索引索引,并将索引类型设置为主索引 n3. 使用索引快速查找记录使用索引快速查找记录nFIND命令和命令和SEEK命令都可在指定主控索引的情况下命令都可在指定主控索引的情况下进行记录的查找操作进行记录的查找操作 n】】SEEK <表达式> n USE Rsda ORDER TAG bhn && 打开打开Rsda同时指定同时指定BH为主控索引为主控索引n SEEK "03001"n SET ORDER TO rq n && 重新指定重新指定rq为主控索引为主控索引n SEEK CTOD("202X.09.06") n && 日期格式要与设置相同,否则会出错日期格式要与设置相同,否则会出错n DISPLAY 3.5 数据表的统计计算数据表的统计计算n3.5.1 累加求和及求平均值n对每个记录的横向求和和统计可以用前面介绍的操作或命令对每个记录的横向求和和统计可以用前面介绍的操作或命令方便地给出,如方便地给出,如REPLACE命令。
对于每个记录的纵向求和命令对于每个记录的纵向求和统计可以用累加求和命令实现统计可以用累加求和命令实现n【【格式格式】】SUM|AVERAGE [<表达式表>][<范围>][FOR <条件表达式>]n [WHILE <条件表达式>][TO <内存变量名表>]|[TO <数组变量名>]n【【例例】】求出中计算机系所有职工的月基本工资平均值及全年实发工资求出中计算机系所有职工的月基本工资平均值及全年实发工资之和并显示之和并显示n CLEARn SET TALK OFFn USE Rsgzn AVERAGE 基本工资基本工资 TO pj_jbgz FOR SUBSTR(编号编号,1,2)="03"n SUM 实发工资实发工资*12 TO qn_sfgz FOR SUBSTR(编号编号,1,2)="03"n ?"计算机系职工的月平均工资为:计算机系职工的月平均工资为:",pj_jbgzn ?"计算机职工的全年实发工资之和为:计算机职工的全年实发工资之和为:",qn_sfgzn USEn SET TALK ONn RETURNn3.5.2 统计记录个数n【【格式格式】】COUNT [<范围>][FOR <条件表达式>]n [WHILE <条件表达式>][TO <内存变量名表>]|[TO <数组变量名>]n3.5.3 分类汇总n分类汇总对已经建立了索引并且指定了主控索引的数据表,可以按关键字进行分类求和n【格式】TOTAL ON <关键字表达式> TO <新表名> [FIELDS <字段名表>]n [<范围>][FOR <条件表达式1>][WHILE <条件表达式2>]n①① 当前数据表必须是按<关键字表达式>索引过,并指当前数据表必须是按<关键字表达式>索引过,并指定该索引为主控索引,以保证具有相同关键字值的记录能定该索引为主控索引,以保证具有相同关键字值的记录能连续访问。
连续访问n②② FIELDS短语给出了需分类求和的字段名,这些字段只能短语给出了需分类求和的字段名,这些字段只能是数值型或货币型的,如果缺省,则对当前表中的所有数值是数值型或货币型的,如果缺省,则对当前表中的所有数值型或货币型字段分类求和不管选不选型或货币型字段分类求和不管选不选FIELDS短语,新表与短语,新表与当前表的结构是一样的当前表的结构是一样的n③③ 对当前数据表中的若干个关键字表达式相同的记录,生成对当前数据表中的若干个关键字表达式相同的记录,生成新表中的一条记录这条记录的非数值型或非货币型字段取自新表中的一条记录这条记录的非数值型或非货币型字段取自关键字相同的一组记录中首记录的相应字段,参加求和的字段关键字相同的一组记录中首记录的相应字段,参加求和的字段值取自求和结果值取自求和结果3.6 数据交换数据交换n3.6.1 数组与数据表的数据交换n1. 将数据表中的记录数据保存到数组中将数据表中的记录数据保存到数组中n【格式一】SCATTER [FIELDS <字段名表>][MEMO] TO <数组名>n【格式二】COPY TO ARRAY <数组名>[FIELDS <字段名表>]n [<范围>][FOR <逻辑表达式>]n【【功能功能】】将当前打开的数据表中的某些记录数据存储在数组中。
将当前打开的数据表中的某些记录数据存储在数组中n2. 将数组中的数据传递到当前数据表中将数组中的数据传递到当前数据表中n【格式一】GATHER FROM <数组名> [FIELDS <字段名表>][MEMO]n【格式二】APPEND FROM ARRAY <数组名>n [FOR <逻辑表达式>][FIELDS <字段名表>]n【【功能功能】】将数组中各元素的数据传递给当前打开的数据表中将数组中各元素的数据传递给当前打开的数据表中n注意:请读者将注意:请读者将COPY TO ARRAY与与SCATTER、、APPEND FROM ARRAY与与GATHER FROM的差别搞清楚的差别搞清楚3.6.2 文件复制n1. 复制部分记录或整个数据表复制部分记录或整个数据表n【【格式格式】】COPY TO <表文件名> [<范围>] [FOR|WHILE <逻辑表达式>]n [FIELDS <字段名表>]n [DATABASE <数据库名> [NAME <长表名>]]n [[WITH] CDX] | [[WITH] PRODUCTION]n | SDF | SYLK | WK1 | WKS | WR1 | WRK | XLS | XL5n | DELIMITED [WITH <定界符> | WITH BLANK | ……n2. 复制数据表的结构复制数据表的结构n【【格式格式】】COPY STRUCTURE TO <表文件名>[FIELDS <字段名表>] [[WITH] CDX | [WITH] PRODUCTION]n说明:说明:①① 若不选可选项,生成的表结构具有若不选可选项,生成的表结构具有与原数据表相同的字段名、类型和宽度。
与原数据表相同的字段名、类型和宽度n②②若选若选FIELDS子句,生成的表结构只有<子句,生成的表结构只有<字段名表>中的字段,字段名之间用逗号隔字段名表>中的字段,字段名之间用逗号隔开n③③ CDX和和PRODUCTION的意义与复制记录的意义与复制记录时的意义一致时的意义一致3.7 多数据表操作多数据表操作n在一个数据库中,一般都有着许多个数据表在一个数据库中,一般都有着许多个数据表而在对这些表的使用中,也经常是多个表中而在对这些表的使用中,也经常是多个表中的数据同时被用到的数据同时被用到VFP提供了强有力的多提供了强有力的多数据表操作能力,引入了工作区和表的别名数据表操作能力,引入了工作区和表的别名这两个概念用户可以在不同的工作区中同这两个概念用户可以在不同的工作区中同时打开多个表,也可以在不同的工作区打开时打开多个表,也可以在不同的工作区打开同一个表,通过表的别名,用户可以引用在同一个表,通过表的别名,用户可以引用在不同工作区打开的表中的数据不同工作区打开的表中的数据n3.7.1 工作区的基本概念n所谓“打开”数据表,实际上就是VFP在内存中开辟了一个区域(亦称缓冲区)与磁盘上数据表之间建立起一种映射关系,使VFP通过缓冲区使用磁盘上数据表里的数据,这个内存中的缓冲区就称为工作区。
n1. 工作区的性质工作区的性质n((1)在每)在每一个工作区中只能打开一个表一个工作区中只能打开一个表,,VFP最最多可以开辟多可以开辟32767个工作区,打开个工作区,打开32767个表允允许一个表在几个工作区中同时打开许一个表在几个工作区中同时打开n( 2 )在某一时刻只能选择一个工作区为在某一时刻只能选择一个工作区为“当前工当前工作区作区”,对其中的表进行操作对其中的表进行操作系统初始状态默系统初始状态默认认1号工作区为当前工作区号工作区为当前工作区n((3)每一工作区打开的数据表都有各自的记录指)每一工作区打开的数据表都有各自的记录指针在一般情况下,对数据表的操作只能移动当前工在一般情况下,对数据表的操作只能移动当前工作区的记录指针当使得数据表之间建立临时关系以作区的记录指针当使得数据表之间建立临时关系以后,另一工作区的记录指针才能根据要求伴随当前工后,另一工作区的记录指针才能根据要求伴随当前工作区的记录指针作相应的移动作区的记录指针作相应的移动n((4))内存变量对各工作区是公用的内存变量对各工作区是公用的,每一工作区的,每一工作区的字段变量对其它各工作区也是公用的字段变量对其它各工作区也是公用的。
在任意工在任意工作区都可以对其它工作区的当前记录进行读、写作区都可以对其它工作区的当前记录进行读、写操作操作n2.工作区的编号和别名2.工作区的编号和别名 为了标识每一个工作区,系统给每一工作区编号,为了标识每一个工作区,系统给每一工作区编号,号码为号码为1、、2、、…、、32767同时还为工作区规定了别同时还为工作区规定了别名,其中名,其中1至至10号工作区别名为号工作区别名为A、、B、、…、、J;;11至至32767号工作区别名为号工作区别名为W11、、W12、、…、、W32767 给数据表命名时,不要与工作区的别名冲突,否则给数据表命名时,不要与工作区的别名冲突,否则容易引起混乱容易引起混乱n3.数据表别名3.数据表别名 在打开数据表的同时,可以为数据表起一个别名,这个别名也作在打开数据表的同时,可以为数据表起一个别名,这个别名也作为打开该数据表的工作区别名为打开该数据表的工作区别名n★★[格式][格式]USE <数据表名数据表名>[[ALIAS<别名别名>][][IN
表n②②ALIAS <别名别名>为可选项,不指定别名时,原数据表为可选项,不指定别名时,原数据表名就是它的别名例如,当执行了命令名就是它的别名例如,当执行了命令“USE Rsda ALIAS da”后,表后,表Rsda的别名就是的别名就是da;而执行了命令;而执行了命令“USE Rsda”后,则默认后,则默认Rsda表的别名表的别名n③③若选择了若选择了IN 0短语,表示在当前没有使用的编短语,表示在当前没有使用的编号最小工作区上打开数据表号最小工作区上打开数据表n④④该命令只是在指定的工作区上打开数据表,并该命令只是在指定的工作区上打开数据表,并不能改变当前工作区改变当前工作需要单独的不能改变当前工作区改变当前工作需要单独的命令n⑤⑤一旦一个工作区上打开了一个数据表,数据表就和一旦一个工作区上打开了一个数据表,数据表就和该工作区建立起对应关系,所以打开数据表后可以用该工作区建立起对应关系,所以打开数据表后可以用数据表的别名来代替工作区别名数据表的别名来代替工作区别名3.7.2 工作区的选择和使用n1. 选择工作区n(1) 利用利用“数据工作区数据工作区”窗口选择工作区窗口选择工作区n选择[窗口]菜单中的[数据工作期]命令,或单击常用工具选择[窗口]菜单中的[数据工作期]命令,或单击常用工具栏中的[数据工作期窗口]按钮,打开[数据工作期]窗口。
栏中的[数据工作期窗口]按钮,打开[数据工作期]窗口n 这时默认当前工作区为 这时默认当前工作区为1单击[打开]按钮选择一个单击[打开]按钮选择一个数据表打开若再次单击[打开]按钮,可以依次在其它工作数据表打开若再次单击[打开]按钮,可以依次在其它工作区打开其它数据表,并且区打开其它数据表,并且可以用显示的别名选择工作区可以用显示的别名选择工作区n 在数据工作期窗口还可以浏览各工作区打开的数据 在数据工作期窗口还可以浏览各工作区打开的数据表,还可以关闭他们表,还可以关闭他们n (2) 利用利用SELECT命令选择工作区命令选择工作区n[格式][格式]SELECT <工作区号工作区号>|<工作区工作区别名别名>|<表别名表别名>n说明:选择当前工作区,选择的工作区中说明:选择当前工作区,选择的工作区中可以是在前面已经打开了数据表,也可以可以是在前面已经打开了数据表,也可以是未曾打开表是未曾打开表n例:例:USE Rsda &&默认在默认在1号工作区打开号工作区打开n SELECT d &&选择选择4号工作区为当前工作区号工作区为当前工作区n USE Rsgl &&在当前(在当前(4号)工作区打开号)工作区打开n USE Rsgz ALIAS gz &&在当前在当前4号工作区打开号工作区打开Rsgz,同时关闭,同时关闭Rsgln SELECT 1 &&选择选择1区为当前工作区区为当前工作区n LIST && 显示当前(显示当前(1号)工作区数据表(号)工作区数据表(Rsda)的记录)的记录n SELECT gz && 或或SELE 4,SELE d ,但不能但不能SELE Rsgzn LIST &&显示显示Rsgz的记录的记录n SELE Rsda &&是否可以?为什幺?是否可以?为什幺?n LISTn ?SELECT三三 &&给出当前工作区号函数,返回当前工作区号给出当前工作区号函数,返回当前工作区号n USE Rsgl IN 10n ?SELECT三三 n USE &&关闭当前工作区上的数据表关闭当前工作区上的数据表n USE Rsgl IN 0 n ?SELECT三三 n2.在不同工作区打开同一个数据表.在不同工作区打开同一个数据表n例例 SELE 1n USE Rsdan USE Rsda ALIAS da IN 3 AGAINn SELE 2n USE Rsda AGAINn3. 使用非当前工作区中表的数据使用非当前工作区中表的数据n方法是在非当前工作区的表的字段名前加方法是在非当前工作区的表的字段名前加注工作区别名或表的别名。
格式为:注工作区别名或表的别名格式为:n<别名>-><字段名> 或或 <别名>.<字段名>n注意,这里的符号注意,这里的符号“->”是是“-”和和“>”两两个(均为半角)符号复合而成个(均为半角)符号复合而成n例例 n SELE 2n USE Rsgl &&未指定主索引顺序未指定主索引顺序,指向1号记录指向1号记录n USE Rsda IN 3n SELE 3n LOCATE FOR 姓名姓名=b->姓名姓名 &&指向同个人指向同个人n DISPLY 部门名,姓名,出生日期,部门名,姓名,出生日期,c.工作日期工作日期 n显示结果如下::n 记录号记录号 部门名部门名 姓名姓名 出生日期出生日期 C->工作日期工作日期n 1 机关机关 韩伟东韩伟东 n在在VFP中,表之间关联有临时关系和永久关系两种关联中,表之间关联有临时关系和永久关系两种关联n1. 设置表的临时关系设置表的临时关系n(1) 利用数据工作期窗口建立表的临时关系利用数据工作期窗口建立表的临时关系3.7.3 数据表的关联n(2) 利用命令建立表之间的临时关系利用命令建立表之间的临时关系n【【格式格式】】SET RELATION TO [<关键字表达式1>|<数值表达式1> INTO <工作区别名1>|<子表别名1> [,<关键字表达式2>|<数值表达式2> INTO <工作区别名2>|<表别名2> …] [ADDITIVE]]n说明:① 必须选择父表所在工作区为当前工作区,然后再使用本命令与非当前工作区中的数据表(子表)建立关联。
n② 选ADDITIVE项可使父数据表与子表建立关联时,原先已存在的关联仍然保留如果不选用该项,则建立新关联时将取消原有关联n③③ 子表必须按关键字表达式中的关键字段建立索引,子表必须按关键字表达式中的关键字段建立索引,且被指定为主控索引若选择数值表达式,则两个表且被指定为主控索引若选择数值表达式,则两个表是按照记录号相联系,此时子表不要求索引通常情是按照记录号相联系,此时子表不要求索引通常情况下,用两个表都具有的相同字段作为建立临时关系况下,用两个表都具有的相同字段作为建立临时关系的关键字表达式的关键字表达式n④④不选任何可选项则取消已与当前表建立的关联父不选任何可选项则取消已与当前表建立的关联父表可以与多个子表建立关联表可以与多个子表建立关联n⑤⑤建立临时关系以后,父表和子表记录指针的移动的建立临时关系以后,父表和子表记录指针的移动的规则是:父表指针每移动到一个记录,子表则按关键规则是:父表指针每移动到一个记录,子表则按关键字表达式的值进行索引查找,并将记录指针定位在相字表达式的值进行索引查找,并将记录指针定位在相应记录上若子表中没有记录和父表的当前记录相关应记录上若子表中没有记录和父表的当前记录相关联,子表的记录指针将指向联,子表的记录指针将指向EOF;若子表中有多个记录和;若子表中有多个记录和父表的当前记录相关联,则子表的记录指针将指向第一个相匹父表的当前记录相关联,则子表的记录指针将指向第一个相匹配的记录。
配的记录n【例】某书店有一个图书库存数据表,存放【例】某书店有一个图书库存数据表,存放有该书店所有的图书信息,另有一个图书调有该书店所有的图书信息,另有一个图书调价数据表,其中存放着图书调价后的新价格价数据表,其中存放着图书调价后的新价格 ,现要求编制程序,用中的单价数据更新中,现要求编制程序,用中的单价数据更新中的单价数据假设数据表中的记录和中的记的单价数据假设数据表中的记录和中的记录是一一对应的,即凡是出现在中图书都调录是一一对应的,即凡是出现在中图书都调价了,则可用如下的程序:价了,则可用如下的程序:n SET TALK OFFn SET SAFETY OFFn USE TSKCn SELECT 2n USE TSGXTJ n INDEX ON 图书编号图书编号 TAG TSBHn SET ORDER TO TSGHnSELECT 1n SET RELATION TO 图书编号图书编号 INTO Bn REPLACE ALL 单价单价 with TSTJ.单价单价n CLOSE ALLn SET SAFETY ONn SET TALK ONn RETURNn2.设置表间的永久关系.设置表间的永久关系n永久关系是存储在数据库文件(永久关系是存储在数据库文件(.DBC)中的数据表之间的)中的数据表之间的关系关系,它作为数据库的组成部分一直保留。
它不像临时,它作为数据库的组成部分一直保留它不像临时关系每次打开数据表时都要重新建立关系每次打开数据表时都要重新建立n数据库中的数据表建立永久关系后,借助这种关系不数据库中的数据表建立永久关系后,借助这种关系不仅仅从当前选定的表中访问数据,而且还可以访问相仅仅从当前选定的表中访问数据,而且还可以访问相关数据表中的数据关数据表中的数据n当在查询设计器,视图设计器、表单设计器中的数据环境中使当在查询设计器,视图设计器、表单设计器中的数据环境中使用这些数据表时,这些永久关系将作为这些表之间的默认连接用这些数据表时,这些永久关系将作为这些表之间的默认连接关系自动出现而且以后使用查询文件,视图文件及表格文件关系自动出现而且以后使用查询文件,视图文件及表格文件时,这些永久关系也自动把相关数据表连接起来时,这些永久关系也自动把相关数据表连接起来n与永久关系的作用不同,临时关系是控与永久关系的作用不同,临时关系是控制表之间制表之间记录指针的连动关系记录指针的连动关系永久关系不具有这个功能,而是使系不具有这个功能,而是使相关数据建相关数据建立连接关系立连接关系n在永久关系中还可以建立参照完整性,在永久关系中还可以建立参照完整性,对各数据表之间进行完整性约束。
对各数据表之间进行完整性约束n表之间关系的类型表之间关系的类型n表与表之间的关系实际上就是,表与表之间的关系实际上就是,按照某一关键按照某一关键字建立的几个数据表之间相关记录的关系字建立的几个数据表之间相关记录的关系n根据一个表中的记录与另一表中相关记录之间的根据一个表中的记录与另一表中相关记录之间的对应数量关系,关系的类型可分为:对应数量关系,关系的类型可分为:n一对一关系:是指一个表中的一个记一对一关系:是指一个表中的一个记录与另一表中的唯一记录相关联录与另一表中的唯一记录相关联n一对多关系:是指一个表中的一个记一对多关系:是指一个表中的一个记录与另一表中的多个记录相关联,但录与另一表中的多个记录相关联,但另一表中的一个记录则只能与这个表另一表中的一个记录则只能与这个表中的唯一记录相对应中的唯一记录相对应n在关系数据库设计时,应避免将表设在关系数据库设计时,应避免将表设计成计成“多对多关系多对多关系”,通过数据规范,通过数据规范化设计将化设计将“多对多关系多对多关系”转换成转换成“一一对多关系对多关系”来建立数据库也可以在来建立数据库也可以在两个表间建立一个连接表,两个表分两个表间建立一个连接表,两个表分别和连接表建立一对多关系,间接实别和连接表建立一对多关系,间接实现多对多关系现多对多关系n((1)建立表间的永久连接)建立表间的永久连接n建立建立Rsbm与与Rsgl的关联、的关联、Rsgl与与Rsda的关联。
的关联Rsgl与与Rsda根据编号建立一对根据编号建立一对一的关联;由于在一的关联;由于在Rsbm中一个部门可以中一个部门可以在在Rsgl中找到多条记录,所以两个数据表中找到多条记录,所以两个数据表之间的关系为一对多的关系两个表已根之间的关系为一对多的关系两个表已根据共同字段据共同字段“部门名部门名”建立了索引,建立了索引,“一一”方(方(Rsbm)建立了以)建立了以“部门名部门名”为索为索引标识的主索引,引标识的主索引,“多多”方建立了以方建立了以“部部门名门名”为索引标识的普通索引为索引标识的普通索引 在数据库设计器中建立永久关系在数据库设计器中建立永久关系 •(2) 编辑数据表之间的关联3.8 管理数据库管理数据库n3.8.1 使用多个数据库n1.在项目中新建或添加数据库.在项目中新建或添加数据库n2.从项目中移去数据库.从项目中移去数据库n3.打开多个数据库.打开多个数据库n4.设置当前数据库.设置当前数据库n5.访问其它数据库中的表.访问其它数据库中的表n OPEN DATABASE &&打开数据库打开数据库Rsgln OPEN DATABASE n &&打开打开Exle并自动将其设为当前数据库并自动将其设为当前数据库n ??DBC三三 &&显示当前数据库名显示当前数据库名n SELECT 4 &&选择第选择第4工作区为当前工作区工作区为当前工作区n USE &&在第在第4工作区上打开数据表工作区上打开数据表 BROWSE &&浏览当前工作区(第浏览当前工作区(第4工作工作区)上的数据区)上的数据n SELE 2 &&选择第选择第2工作区为当前工作区工作区为当前工作区n ??Rsda.姓名姓名 &&显示显示Rsda数据表的当前记录的姓名字段数据表的当前记录的姓名字段n6.关闭数据库.关闭数据库nSET DATABASE TO Rsgln CLOSE DATABASEn另外,用另外,用CLOSE ALL命令可以关闭所命令可以关闭所有打开着的数据库及其他文件。
有打开着的数据库及其他文件 3.8.2 向数据库中添加和删除表n1.向数据库中添加表.向数据库中添加表n2.将数据表从数据库中移走.将数据表从数据库中移走n项目管理器中选择要移走的数据表,单击项目管理器中选择要移走的数据表,单击“移去移去”按钮,系统即弹出确认对话框,按钮,系统即弹出确认对话框,单击单击“移去移去”命令即可将选定的数据表从命令即可将选定的数据表从数据库中移走,成为自由表;若单击数据库中移走,成为自由表;若单击“删删除除”按钮则可将选定的数据表从磁盘上删按钮则可将选定的数据表从磁盘上删除3.8.3 参照完整性n参照完整性是为确保数据库中表间关系不被破坏而设置的一组规则在用参照完整性是为确保数据库中表间关系不被破坏而设置的一组规则在用户修改、增加或删除相关表中的记录时,参照完整性将起保护作用怎样户修改、增加或删除相关表中的记录时,参照完整性将起保护作用怎样才算破坏了连接关系呢?如建立了才算破坏了连接关系呢?如建立了Rsbm和和Rsgl两表的一对多关联,在此两表的一对多关联,在此关联下,如果进行了如下操作关联下,如果进行了如下操作:n(1) 将将Rsbm(父表)中一个父记录删除,而没删除(父表)中一个父记录删除,而没删除Rsgl(子表)中(子表)中所对应的一或多个记录,造成子记录无对应的父记录。
所对应的一或多个记录,造成子记录无对应的父记录n(2) 修改了修改了Rsbm(父表)中某个记录的部门名,而没有修改子表(父表)中某个记录的部门名,而没有修改子表Rsgl的相对应的记录,从而造成的相对应的记录,从而造成rsgl(子表)中一个或多个记录没(子表)中一个或多个记录没有对应的父记录有对应的父记录n(3) 在在Rsgl(子表)中增加了一个无父记录与其对应子记录子表)中增加了一个无父记录与其对应子记录n解决不完整性的一般方法是编写触发器和存储过程代码来实现,但方法复杂解决不完整性的一般方法是编写触发器和存储过程代码来实现,但方法复杂VFP中参照完整性生成器可帮助用户建立参照完整性中参照完整性生成器可帮助用户建立参照完整性n1. 建立参照完整性建立参照完整性n打开下图所示的参照完整性生成器的三种方法打开下图所示的参照完整性生成器的三种方法: 。












