淹城夜景:数据库、表的基本操作(18学时)

来源:百度文库 编辑:偶看新闻 时间:2024/04/27 19:26:21
数据库、表的基本操作(18学时)

 

一、【教学目标】

1.     理解并掌握数据库的创建

2.     理解并掌握数据库表属性的设置

3.     掌握数据库的操作

二、【重点和难点】

重点

1.       数据库的操作。

2.       数据库表的操作。

3.       建立排序和索引。自由表的操作。

4.       使用不同工作区表的操作。

 

难点

1.      数据库表的操作。

2.       索引的建立和使用。

3.        数据完整性的设置。

 

三、【学法指导】

1.  数据库和数据表的建立是本章基础。

2.  编辑表中的数据、记录修改与删除,表的索引等操作,是后续章节的基础。

3.  本章学习的要点是多做上机练习,熟练掌握数据库和数据表的操作。

四、【教学要点】

本章主要介绍数据库、数据表的基本概念;数据库和数据表的建立、编辑表中的数据、记录修改与删除,表的索引等有关操作。

2.1 VFP数据库及其建立

数据库管理系统是一种极为重要的程序设计语言,它与其他语言的主要差异在于它先天具备组织管理和高效率访问大批量数据的功能。设计一个功能齐全、结构优化的数据库,是设计数据库管理系统必不可少的一个重要环节。VFP中文版为我们提供两个功能强大的数据库设计工具——数据库向导和数据库设计器。数据库向导能帮助初学者在很短的时间内设计出一个数据库。而数据库设计器能设计出满足用户实际需要的较为复杂的数据库。它们不仅能设计建立数据库,而且还提供了一套完善的数据库管理和维护功能。

2.1.1基本概念

1.数据库的概念

一定要注意,在VISUAL FOXPRO 中数据库与表是两个不同的概念,数据库文件是各项与数据库相关信息的汇集处,数据库可以管理表,查询,视图等数据实体,又可提供了数据字典,各种数据保护及数据管理功能。

在建立数据库时,相应的数据库名称实际是扩展名为DBC的文件,与之相关的还会自动建立一个扩展名DCT的数据库备注文件和一个扩展名为DCX的数据库索引文件.

数据库建立好后,还只是一空库,它没有任何数据,需要建立或添加数据库表才能实现对数据的统一的管理。

2.表的概念

VFP作为关系型数据库系统,是用来管理数据的,而数据以记录和字段的形式存储在数据库中,数据库就是一个关于某一特定主题或目标的信息集合。表是从简单数据处理到创建关系型数据库,再到设计应用程序的过程中所用到的基本单位,它是数据库的基础,可以说,表是关系数据库系统中的基本结构。如果要保存数据,就应为所需记录的信息创建一个表。数据表是由行和列组成的,每一行称为一条记录,每一列称为一个字段。

每条记录可以有若干个字段,而且每条记录具有相同结构的字段。相同结构的含义是具有相同的字段名、字段类型和字段顺序。

2.1.2建立数据库

数据库的建立

建立数据库的常用方法有以下三种:

l         在项目管理器中建立数据库.

l         通过”新建”工具或”文件”菜单的”新建”一项实现.

l         使用命令CREATE  DATABASE建立.

1.在项目管理器中建立数据库

在项目管理器中建立数据库首先要打开相应的项目, 在”数据”选项卡中选择”数据库”,再单击”新建”按钮并选择”新建数据库”(如图2.1),


图2.1

接着通过创建对话框提示用户输入数据库的名称(名称由用户自己命名), 如果未命名,则系统默认文件名为”数据1”(如图2.2),相应的扩展名为.DBC.


图2.2

2.通过”新建”对话框建立数据库


图2.3

单击工具栏上的”新建”按钮或者选择”文件”菜单下的”新建”,打开如图2.3所示的”新建”对话框.首先在”文件类型”组框中选择”数据库”,然后单击”新建文件”按钮建立数据库,然后的操作和步骤与在项目管理器中建立数据库相同,使用这种方法建立的数据库同样处于打开状态,同时打开相应的数据库设计器.如图2.4

 


图2.4

3.使用命令建立数据库.

建立数据库的命令格式是:

CREATE  DATABASE [DatabaseName|?]

DatabaseName为用户要建立的数据库名称.

如不输入名称或使用”?”将出现提示用户输入名称对话框.如图2.5


图2.5

使用该命令所建立的数据库处于打开状态,不过相应的数据库设计器并没有打开,这是与上面两种方法不同的地方。

     总之,使用以上三种方法都可以建立一个新的数据库。如果指定的数据库已经存在,很可能会覆盖掉已经存在的数据库。如果系统环境参数SAFETY被设置为OFF状态会直接覆盖,否则会出现警告对话核框请用户确认因此,为安全起见可能先执行SET SATETY ON。

2.1.3数据库的使用

1.数据库的打开

建立数据库的目的是管理表中的数据,在使用之前,必须先打开数据库,常用的数据库打开方法有如下三种:

①通过“文件”菜单的“打开”功能项打开相应的数据库。如图2.6所示,这里要注意“文件类型”下拉列表选择“数据库(*.dbc).


图2.6

在“打开”对话框中还有“以只读方式”和“独占”两个复选框可供选择,它们的功能将在命令格式中加以介绍。

②在项目管理器中打开数据库。

先打开数据库所在的项目,再选择相应的已存在的数据库名称。这时数据库自动打开,用户不必再执行手工打开数据库操作。

③使用命令方式打开数据库

打开数据库的命令格式为:

OPEN  DATABASE  [Filename|?][EXCLUSIVE|][NOUPDATE]

参数说明:

Filename为要打开的数据库名称

EXCLUSIVE以独占方式打开数据库,即在同一时刻不允许多个用户同时使用。

SHARED以共享方式打开数据库,等同于“打开”对话框中的不选择“独占”复选项。

NOUPDATE指定数据库按只读方式打开,等效于在“打开” 对话框中选择复选项“以只读方式打开”,即不允许对数据库库进行写操作。数据库文件打开默认的方式是可读写方式。

2.数据库的修改

在VISUAL FOXPRO中数据库的修改要通过“数据库设计器”来实现,所以要想修改数据库,必须先打开“数据库设计器”,通过“数据库设计器”来完成对数据库的建立,修改和删除等操作。

我们前面讲过,数据库一旦打开,“数据库设计器”便随之自动打开,所以我们先要打开要修改的数据库。

如果是通过“项目管理器”打开的数据库,如图2.7所示,点击“修改”按钮,便打开了“数据库设计器”。


图2.7

在命令窗口中打开数据库设计器或修改数据库的命令格式为:

MODIFY  DATABASE[Databasename|?][NOWAIT][NOEDIT]

说明:

Databasename为要打开的数据库名称。

如果使用“?”或不使用Databasename系统将出现提示“打开”对话框,要求用户选择要打开的数据库。

NOWAIT该选项只在程序方式中使用,在命令窗口无效。

NOEDIT表示允许打开数据库,但不允许修改。

3、数据库的删除

在使用中,如果某个数据库不再有用,我们可以将其从项目管理器或磁盘上清除。

从项目管理器中删除

打开项目管理器,选择“移去”按钮,出现如图2.8所示对话框。


图2.8

这时有三个选项,这三个选项的功能如下:

移去:只从项目管理器中删除数据库,并没有真正从磁盘中删除数据库文件。

删除:真正从磁盘中删除数据库文件,这时项目管理器中也一定不存在该文件。

取消:取消当前操作,不对数据库进行删除。

使用这种方式删除数据库,并没有将数据库中的表,视图等数据库对象从磁盘中删除,因为表,视图等对象是以文件的形式独立存在于磁盘上的,要想在删除数据库的同时,删除相应的表等文件,可以使用命令格式。

删除数据库的命令格式为:

DELETE  DATABASE Databasename|?[DELETETABLES][RECYCLE]

说明:Databasename为要删除数据库的名称。如果未指定名称,系统将提示用户打开相应的数据库。

DELETETABLES表示在删除数据库的同时,删除数据中的数据库表。

RECYCLE将删除的数据库和数据库表等文件放入WINDOWS的回收站,需要时可以再还原。

2.2建立数据库表

上节介绍了数据库的基本操作,数据库实际是对数据库表等对象进行管理,没有表,数据库的存在也就没有多大的意义了。下面介绍如何建立表和数据库表。

2.2.1在数据库中建立表

1.应用“文件”菜单的“新建”功能项创建表

单击“文件”菜单的“新建”选项,在“文件类型”对话框中选择“表”,再选择“新建文件”按钮,输入要创建的表的名称,出现如图2.9所示对话框。


图2.9

2.应用项目管理器创建表

打开相应的项目管理器及数据库,如图所示,选择“表”及“新建”,填入相应的表的名称,即出现如图所示对话框,这时所建的表为数据库表。如果在项目管理器中直接选择“自由表”一项,建立的表就是自由表。


图2.10

这里对表设计器中涉及到的一些基本内容和概念作一解释。


图2.11

1.字段名

记录中的每一个字段都是有名称的,但在命名字段时,要遵守如下规则:

(1)字段名必须以字母或汉字开头。

(2)字段名可以由字母、汉字、下划线和数字组成。

(3)数据库表字段名最大长度不能超过128个字符。

(4)自由表字段名最大长度不能超过10个字符。

(5)字段名中不能有空格。

2.字段类型

字段可以使用的数据类型有如下几种,下面对这几种数据类型分别给予介绍。

字符型(Character)。字符型字段通常用于存储文本数据。如字母、汉字、数字、空格、符号以及标点符号等。字符型字段的宽度最大为254个字符。

货币型(Currency)。货币单位,如货物的价格。

数值型(NumeriC)。数值型字段用来存储数值数据。它可以包含数字0~9,也可以带正、负号或小数点。

浮点型(Float)。浮点型字段在功能上等价于数值型字段。其长度在表中最长可达20位。

日期型(Date)。日期型用于存储由年、月、日组成的日期数据。

日期时间型(DateTime)。日期时间型用于存储包含有年、月、日、时、分、秒的日期和时间数据。

双精度型(Double)。双精度型用于存储精度要求较高、位数固定的数值,或真正的浮点数值。

备注型(Memo)。备注型用于存储不定长度的文本数据。当文本数据长度不定且长度可能大于254,无法使用字符型字段存储时,例如个人简历。备注型字段的字际内容存储在以.FPT为扩展名的文件中.在内存中占四个字节。主文件名与表的主文件名相同。

通用型(General)。通用型用于存储OLE 对象数据。通常由字段的链接与嵌入实现。字段宽度固定为4个字节,用于存储一个4个字节的指针,指向该字段的实际内容。通用型字段的实际内容存储在扩展名为.FPT文件中。如EXCEL电子表格、WORD字处理文档、图像或其他多媒体对象等。通用字段存储数据的大小,取决于相关对象的OLE服务程序,并受可用磁盘空间大小的限制。

整形(Integer)。整形用于存储整数型数据,字段宽度固定为4个字节。字符型(二进制)(Character Binary)。字符型(二进制)用于存储不需要系统代码页页维护的字符数据。其他字段特性同字符型字段。

备注型(二进制)(Memo Binary)。备注型(二进制)用于存储不需要系统代码页维护的备注字段数据。其他字段特性同备注型字段。

3.字段宽度

每一种数据类型都有其规定宽度。

字符型字段的最大宽度为254。

货币型字侧面宽度固定为8个字节。

数据型字段的最大宽度为20个字节,小数位数最大为19。

浮点型字段在功能上等价于数值型字段。

日期型字段宽度固定为8个字节。

日期时间型字段宽度固定为8个字节。

双精度型字段宽度固定为8个字节。

备注型字段宽度固定为4个字节,用于存储一个4个字节的指针,指向存储的FPT文件中真正的备注内容。备注字段存储文本长度仅受可用磁盘空间大小的限制。

通用型字段宽度固定为4个字节,用于存储一个4个字节的指针,指向该字段的实际内容。

整型字段宽度固定为4个字节。

小数位数

当字段类型为“Numeric”或“Float”,应在“小数位数”栏中设置小数的位数。

4.空值

是否允许为空(NULL)如果允许字段接受“NULL”栏所在框,则应选中“NULL”栏所在框,否则,不选中该栏,表的字段不允许为NULL值。

5.字段的显示属性

 

格式:控制字段在浏览窗口、表单、报表等显示时的样式。

输入掩码:控制输入该字段的数据的格式。如:商品编号的格式由一个字母和一个五位数字组成,则掩码可以定义为S99999

 

标题:若表结构中字段名用的是英文,则可以在标题中输入汉字,这样显示该字段值时就比较直观了。没有设置标题,则将表结构中的字段名作为字段的标题。

 

 

 

 

6.字段有效性

 

规则:限制该字段的数据的有效范围。在规则中输入:性别="男".OR.性别="女"。这样当给“性别”字段输入记录值时就只能输入“男”或“女”。 订购数量的有效性规则可以设为:订购数量>=0 .and.订购数量<=1000。

 

 

信息:当向设置了规则的字段输入不符合规则的数据时,就会将所设置的信息显示出。

 

默认值:当往表中添加记录时,系统向该字段预置的值。在“性别”字段中输入默认值为“男”。输入记录时只有女生才需要改变默认值,可以减少输入。字段有效性的设置如图2.11所示。

 

2.2.2修改表结构

在VFP中,表结构可以任意修改:可以增加、删除字段,可以修改字段的宽度,可以建立、修改、删除有效性规则、索引等。

1.以项目管理器方式修改:

   在项目管理器窗口中选择“数据”选项卡,选定“表”,再单击“修改”按钮。

修改表结构和建立表的表设计器界面完全一样。

2.在当前的数据库设计器中,右击要修改的表,然后从弹出的捷菜单中选择修改。

3.在命令窗口中使用命令

命令格式:MODIFY STRUCTURE

修改表结构和建立表的表设计器界面是完全一样的,目前可以做的修改包括:

①修改已有的字段

②增加新字段

③删除不用的字段

2.3表的基本操作

2.3.1使用浏览器操作表

如果交互对表中的数据进行操作,那么最简单,方便的方法就是使用Browse浏览器,打开浏览器的方法有多种,常用的方法有:

①在项目管理器中将数据库展开至表,并且选择要操作的表,然后单击“浏览”按扭(如图2.12所示)。


图2.12

②在数据库设计器中选择要操作的表,然后从“数据库”菜单中选择“浏览”;或者右键单击要操作的表,然后从弹出菜单中选择“浏览”。

③在命令方式下,首先用USE命令打开要操作的表,然后键入BROWSE命令。

以上各种方式打开的BROWSE浏览器的界面如图2.13所示,在该界面中可以浏览,添加,删除和修改记录等。


图2.13

2.3.2增加记录命令

1. APPEND命令

APPEND命令是在表的尾部增加的记录,它有两种格式:APPEND或APPEND BLANK。

使用APPEND命令需要立刻交互输入新的记录值,界面如图3.14所示,一次可以连续输入多条新的记录,然后用Ctrl+Esc键结束输入新记录。

而APPEND BLANK是在表的尾部增加一条空白记录,然后再用EDIT,CHANGE或BROWSE命令交互输入(修改)空白记录的值,或用REPLACE命令直接修改空白记录值。

2. INSERT命令

INSERT命令可以在表的任意位置插入新的记录,命令格是:

INSER[BEFORE][BLANK]

如果不指定BEFORE,则在当前记录之后插入一条新记录,否则在当前记录之前插入一条新记录。

如果不指定BLANK,则直接出现编辑界面,并交互输入记录的值;否则在当前极力之后(或之前)插入一条空记录,然后再用EDIT,CHANGE或BROWSE命令交互输入(修改)空白记录的值,或用REPLACE命令直接修改该空白记录值。

2.3.3删除记录命令

1.置删除标记的命令

逻辑删除或置删除标记的命令是DELETE,常用格式如下:

DELETE[FORlExpressionl]

如果不用FOR短语指定逻辑条件,则只逻辑删除当前一条记录;如果用FOR短语指定了逻辑表达式lExpressionl,则逻辑删除使该逻辑表达式为真的所有记录。

例2.1 逻辑删除当前表商品名称为夹心饼干的记录。

Dele for 商品名称="夹心饼干"


图2.14

2.恢复记录的命令

被逻辑删除的记录可以恢复,恢复记录的命令是RECALL,常用格式如下:

         RECALL[FORlExpressionl]

如果不用FOR短语指定逻辑条件,则只恢复当前一条记录(如果当前记录没有删除标记,则该命令什么都不做);如果用FOR短语指定了逻辑表达式lExpressionl,则恢复使该逻辑表达式为真的所有记录。

例2.2 将当前表中已经删除的夹心饼干恢复。

Recall for商品名称="夹心饼干"

3.物理删除有删除标记的记录

物理删除有删除标记记录的命令是PACK,执行该命令后所有有删除标记的记录将从表中被物理地删除,并且不可能再恢复。

例2.3 将当前表中有删除标记的记录物理删除.

Pack

4.物理删除表中的全部记录

使用ZAP命令可以物理删除表中的全部记录(不管是否有删除标记),该命令只是删除全部记录,并没有删除表,执行完该命令后表结构依然存在。

2.3.4修改记录命令

1.交互修改的命令

EDIT和CHANGE均用于交互对当前的表的记录进行编辑、修改,可通过鼠标操作快速定位到要修改的记录,然后直接在原有的基础上修改。

2.直接修改的REPLACE命令

可以使用命令直接用指定表达式或值修改记录,

REPLACE命令的常用格式为:

【格式】REPLACE <字段名1> WITH <表达式1> [FOR <逻辑表达式1>]

【功能】用指定表达式的值替换当前表中满足条件记录的指定字段的值。

 

 

说明:该命令适合对当前库进行成批地、有规律地修改。缺省范围、条件时,仅替换当前记录, 该命令回车后,数据修改自动完成。

 

例2.4 求出订购单表中的金额

Replace all 金额 with 单价*订购数量

2.3.5显示记录的命令

 

【格式】LIST | DISPLAY [FIELDS <字段名表>][<范围>] [FOR<条件表达式>]

【功能】将当前表文件的记录按照指定的选项进行显示。

 

【说明】DISPLAY命令与LIST命令的功能相似,当表文件的数据记录较多时,用DISPLAY命令较为方便。

如果同时缺省<范围>和 <条件>子句,DISPLAY命令只显示当前的一条记录,而LIST命令则是取默认值ALL而显示全部记录。

FIELDS <字段名表>:用来指定显示的字段。FOR<条件表达式>:指定对表文件中指定范围内满足条件的记录进行操作。

 

 

<范围>:用来指定显示哪些记录。

“范围”有以下四种表示方法:

·

●          ALL:所有记录。

·NEXT  N:从当前记录开始,后面的N条记录(包括当前记录)

  

·RECORD N:第N条记录。

·REST:当前记录后的全部记录(包括当前记录)。

例2.5  显示最后一个字为“酒”的记录

  List for right(商品名称,2)= "酒"

2.3.6查询定位命令

1.绝对定位

  GO[to][record][<物理记录号>|<内存变量表达式>]|[top]|[bottom]

  【功能】将记录指针移动到指定的位置

2.相对定位

   skip[±记录数]

  【功能】从当前记录开始向前或向后移动记录指针。

3.用LOCATE命令定位

【格式】LOCATE [<范围>] [FOR <条件>]

【功能】按顺序搜索表,从而找到满足指定逻辑表达式的第一个记录。

参数描述:

[<范围>]:指定要定位的记录范围。只有在范围内的记录才被定位。LOCATE命令的默认范围是ALL。

[FOR <条件>]:LOCATE命令按顺序搜索当前表以找到满足逻辑表达式的第一个记录。如果让指针指向下一条满足条件的记录上,使用CONTINUE命令。

例2.6使指针指向烟酒类的记录

    LOCATE  FOR 类别="烟酒"          

    CONTINUE

2.4索引和排序

2.4.1索引概念

数据库表记录一般是按照其输入的顺序进行显示的。在处理表记录的过程中,通常是按照表中记录的存储顺序进行。当数据库表中记录的数据很多时,按照这种方法显示就不便于用户查找自己需要的信息。特别是当需要按照另外的顺序处理时,可以使用索引来改变记录的顺序。

由于索引文件中存储的是按照某一字段的值排列的一组记录号,每条记录号指向一个待处理的记录,所以实际上索引可以理解为根据某一字段的值进行逻辑排序的一组指针。在按照索引重新排列的数据库表中显示的记录,VFP将按照指针排列的顺序分别读取每一条记录,而这些记录在数据库中的实际存储位置并未改变。

1.索引的结构

VFP中有三种索引:结构复合索引(.CDX)、非结构复合索引(.CDX)、独立索引(.IDX)。其中结构复合索引是所有索引中最重要的索引。本书中大多是结构复合索引,它的特点是:

在表打开时自动打开。

在同一个索引文件中可以有多种排序方式,具有多个索引关键字。

在对表进行添加、更改、删除时索引文件自动维护。

2.索引的类型

在数据库中,把用来确定索引顺序的字段称为关键字字段。在VFP中,可以根据关键字字段建立下列四各类型索引:主索引、候选索引、普通索引及惟一索引。

主索引:可以确保字段中输入值的惟一性并决定了处理记录的顺序。在创建数据时,除了纽带表以外,一般应根据主关键字字段给每一个表建立主索引。但不能给自由表建立主索引。

候选索引:同主索引一样也能确保字段值的惟一性,也能根据候选索引决定处理记录的顺序。与主索引不同的是,自由表可以建立候选索引。在数据表中,主索引只能有一个,但候选索引可以有多个。在创建数据库时,应根据主关键字字段以外的其他字段建立候选索引。

普通索引:也可以决定记录的处理顺序,但其最大的特点是允许字段中的值可以重复。在创建数据库时,应在位于一对多关系的多端的表中建立一个普通索引。这样,在根据普通索引排序或查询记录时,系统将列出所有符合条件的记录。在一个表中可以加入多个普通索引。

惟一索引:为了保证与以前版本的兼容性,VFP中可以使用惟一索引。惟一索引允许出现重复,但惟一索引只存储索引文件中重复值第一次出现的记录。“惟一”指索引文件对每一个特定的关键字只存储一次,而忽略了重复值第二次及以后的记录。

2.4.2在表设计器中建立索引

对于表,可以对一个字段或一个表达式建立索引。为了使索引更为有效,对于那些经常用于对表、视图或报表建立过滤器的字段最好建立索引。如果用户对不经常用于过滤或查询的字段建立索引,它有可能降低运行效率。建立索引的操作步骤如下:

①在“项目管理器”中,选择想要加入字段的“表”,然后选择“修改”按钮。在所显示的“表设计器”中,选择“索引”,。

②在“索引名”框中,输入索引名。

③在“类型”处,选择索引类型。

④在“表达式”框中,输入“索引表达式”,或单击右侧“…”按钮,系统进入“表达式生成器”对话框,来定义表达式。

⑤如果想要选择记录,可以在“筛选”框右侧,单击“ … ”按钮,系统进入“表达式生成器”对话框,建立过滤器。单击“确定”按钮,完成索引的创建。

如果在表中建立一个主索引或候选索引,输入记录时,系统还可以自动验证输入的记录是否有重复。如果出现重复值,系统将警告输入的数据违背了惟一性规定。这时需要对出现的重复记录进行修改,或者还原记录的原有内容。

虽然利用索引可以提供数据的排序和查找速度,但是,如果建立很多不常使用的索引,不但不能提高程序的执行速度,相反只能起到负面作用。

使用索引应遵循的原则

按照工作性质的不同,用户可以应用不同的索引,索引的使用最好遵循以下原则:为了提高显示、查询、打印的速度,用“普通索引”、“候选索引”或“主索引”。为了控制字段的重复值或记录进行排序,对数据库“表”用“主索引”或“候选索引”,对于“自由表”,用“候选索引”。

2.4.3用命令建立索引

【格式】INDEX ON <索引关键表达式> TO <索引文件名>/[ TAG] <索引标记名>  [UNIQUE] FOR <条件>[ADDITIVE]

【功能】对当前表中满足条件的记录,按<索引表达式>的值建立一个索引文件,并打开此索引文件,其缺省的文件扩展名为.IDX。

<索引关键表达式>: 用以指定记录重新排序的字段或表达式。

例2.7给商品表按建立索引

   INDEX ON 商品编号 TAG商品编号

2.4.4 使用索引

1.打开索引文件

①在打开表时打开索引文件

格式:USE <表文件名> INDEX <索引文件名表> [ORDER <数值表达式>/ <单索引文件名> [OF <复合索引文件名>]] [ASCENDING/ DESCENDING]

②在打开表后打开索引文件

格式:SET INDEX TO [<索引文件名表>/?] [ORDER <索引号>/<复合索引文件名>/[TAG] <索引标记> [OF <复合索引文件名>]] [ASCENDING/DESCENDING] [ADDITIVE]

2.设置主控索引

格式:SET ORDER TO [<数值表达式>/<单索引文件名>/[TAG] <索引标记> [OF <复合索引文件名>] [ASCENDING/DESCEN-DING]

3.使用索引快速定位

格式:SEEK <表达式> [ORDER <索引号>/<单索引文件名>/ [TAG] <索引标记> [OF <复合索引文件名>] [ASCENDING/ DESCENDING]]

例2.8 假设当前使用商品表,将指针定位在商品编号为S10003的记录上

SEEK "S10003" ORDER 商品编号

4.删除索引

DELETE TAG 索引名

2.4.5排序

分类将关键字段值相同的记录按顺序存放在一起,生成一个新的表文件。

格式:SORT TO <表文件名> ON <字段名1> [/A | /D] [/C] [,<字段名2> [/A | /D] [/C] ...] [ASCENDING|DESCENDING] [<范围>] [FOR <逻辑表达式>]

<表文件名>:指定经过排序后所生成的新表的表文件名。 

ON <字段名1>:在当前选定的、要排序的表中指定关键字段,字段的内容和数据类型决定了记录在新表中的顺序。

[/A | /D]  [/C]:指定排序顺序(升序或降序)。/A指定为按升序排序,/D指定按降序排序。如果在字符型字段名后面包含/C,则忽略大小写。可以把/C选项与/A或/D选项组合起来。

[ASCENDING]:将所有不带/D的字段指定为升序排列。

[DESCENDING]:将所有不带/A的字段指定为降序排列。如果省略ASCENDING 和DESCENDING参数,则排序默认为升序。

[<范围>]:指定需要排序记录的范围。默认范围为ALL。

[FOR <逻辑表达式>] :在当前表中指定排序中只包含逻辑条件为“真”的记录。

例2.9 把类别表按类别排序

    SORT TO 商品1 ON 商品编号

2.5数据完整性

2.5.1 实体完整性与主关键字

实体完整性是保证表中记录唯一的特征,即在一个表中不允许有重复记录。在VFP中利用主关键字或候选关键字来保证表中记录的唯一,即保证实体唯一性。

如果一个 字段的值或几个字段的值能够唯一标识表中的一条记录,则这样的字段称为候选主关键字。在一个表中可能有几个具有这种特征字段或字段的组合,这时从中选择一个座位主关键字。

在VFP中将主关键字称为主索引,将候选关键字称为候选索引。

2.5.2域完整性与约束规则

域完整性应该是我们最熟悉的了,以前我们所熟知的数据类型的定义都是域完整性的范畴。如对于数值型字段,通过制定不同的宽度说明不同范围的数据类型,从而可以限定字段的取值类型和取值范围。但这些对域完整性还远远不够,我们还可以用一些域约束规则来进一步保证域完整性。域约束规则也称作字段的有效性规则,在插入或修改字段值时被激活,主要用于数据输入正确性的检验。

建立字段有效性规则比较简单直接的方法仍然是在表设计器中建立,在表设计器的“字段”选项卡中有一组定义字段有效性的项目,它们是规则、信息、默认值三项。具体操作步骤是:

①首先单击选择要定义字段的有效性规则的字段。

②然后分别输入和编辑规则、信息及默认值等项目。

字段有效性规则的项目可以直接输入,也可以单击输入旁的按钮打开表达式生成器对话框编辑、生成相应的表达式。

   以商品进货销售系统数据库中的订购单为例,设订购单的订购数量有效性规则在100至200之间,当输入的订购数量不再此范围内时给出出错提示:订购数量的默认值是100。

为此,在“规则”框中(或表达式生成器)输入表达式:

订购数量>=100.AND.订购数量<=200

在“信息”框中(表达式生成器)输入表达式:

“订购数量输入错误,应该在100—200之间”

在“默认值”框中(或表达式生成器)输入表达式:100

2.5.3参照完整性与表之间的关联

参照完整性与表之间的关联有关,它的大概含义是:当插入、删除或修改一个表中的数据时,通过参照引用相互关联的另一个表中的数据,来检查对表的数据操作是否正确。假如销售单记录有商品编号字段构成,当插入一条这样的记录时,如果没有参照完整性检查,则可能会插入一个并不存在的商品记录,这时插入的记录肯定是错误的,进行参照完整性检查,则可以保证插入记录的合法性。

参照完整性是关系数据库管理系统的一个很重要的功能。在Visual FoxPro中为了建立参照完整性,必须首先建立表之间的联系(在中文版Visual FoxPro中称为关系)。

在数据库设计器中设计表之间的联系时,要在父表中建立主索引,在子表中建立普通索引,然后通过父表的主索引和子表的普通索引建立起两个表之间的联系。


图2.15

图2.15显示了数据库设计器中已经建立好的3个表。在这3个表中,商品和订购单之间有一个一对多的联系,连接字段是商品编号;在供应商和订购单之间有一个一对多的联系,连接字段是供应商号。

我们先建立商品和订购单之间的一对多联系,具体方法是:在图2.15所示的数据库设计器中用鼠标单击选中商品表中的主索引商品编号,按住鼠标左键,并拖动鼠标到订购单表的商品编号索引上(鼠标箭头会变成小矩形状),最后释放鼠标联系就建立好了。用同样的方法可以建立供应商和订购单之间的联系。


图2.16

建立好联系的表如图2.16所示(观察连接表的符号,这时默认的是一对多的联系)。如果在建立联系时操作有误,随时可以通过编辑修改联系。方法是用鼠标右击要修改的联系,然后从弹出的菜单中选择“编辑关系”打开“编辑关系”对话框,如图2.17所示。


图2.17

到目前为止,只是建立了表之间的联系,Visual FoxPro默认没有建立任何参照完整性约束。

在建立参照完整性之前必须首先清理数据库,这时可以在“数据库”(只要打开数据库设计器就会有该菜单项)菜单中选择“清理数据库”。

在清理完整数据库后,用鼠标右击表之间的联系并从弹出菜单选择“编辑参照完整性”,打开的参照完整性生成器如图2.18所示(注意:不管单击哪个联系,所有联系将都出现在参照完整性生成器中)。

参照完整性规则完整性规则包括更新规则、删除规则、插入规则。


图2.18

2.6自由表

1.建立数据库表

要将已建好的自由表添加至某数据库中,可以先打开“数据库设计器”,点击右键,选择“添加表”一项,如图所示。再从出现的窗口中找到相应的表名即可。


图2.19

 这时该表即成为指定数据库的数据库表,出现在数据库设计器中。如下图所示。


图2.20

也可以在建表时,直接建立数据库表。

打开项目管理器,选择相应数据库,如图2.21所示。点击右侧“新建”按钮,再一次出现上述重复画面,这是所建的表是数据库1的数据库表。


图2.21

2、将数据库表转化为自由表

打开数据库设计器,如图所示,选择要成为自由表的表,点击右键,选择“删除”,出现如图2.22所示对话框,


图2.22

移去:将表从数据库中移去,成为自由表。

删除:将表从盘上永久删除,不再可恢复。

取消:取消当前操作。


图2.23

2.7多个表同时使用

2.7.1多工作区的概念

多表(工作区)的同时使用

迄今所讲述的对表的操作都是在一个工作区进行的,每个工作区最多只能打开一个表文件,用USE命令打开一个新的表,同时也就关闭了前面已打开的表。在实际应用中,用户常常需要同时打开多个表文件,以便对多个表文件的数据进行操作。为了解决这一问题,Visual FoxPro引入了工作区的概念。Visual FoxPro允许用户在表间建立临时关系和永久关系。 

1.工作区和当前工作区

VFP 能同时提供32767个工作区。系统默认值为1区。在任意时刻,只有一个工作区是当前工作区,用户只能在当前工作区对打开的当前库进行操作。             每一个工作区都可以并且只能打开一个数据库文件。同一个数据库文件不允许同时在多个工作区打开,但在其它工作区中被关闭之后,可以在任意一个工作区中被打开。各工作区中打开的数据库彼此相互独立(指针不受影响)。

2.选择当前工作区(每一个工作区用工作区号或别名来标识)

①工作区号

利用数字1~32767来标识32767个不同的工作区

②别名

前10工作区用A~J10个字母来标识,11~32767工作区用W11~W32767表示。

采用该工作区中已打开的数据表的表名来作别名

用户自己定义

③工作区的选择

当系统启动时,1号工作区是当前工作区,若想改变当前工作区,则可使用SELECT命令来转换当前工作区。

【命令格式】SELECT<工作区号>/<工作区别名>

【功能】选择一个工作区作为当前工作区。

说明:<工作区号> | <工作区别名>:指定当前工作区。选择工作区时,可以直接指定区号,也可以通过别名指定工作区,二者是等效的。

别名可以是系统规定的别名,也可以是用户规定的别名,甚至可以用已打开的表名替代工作区别名。 

执行该命令后,对任何工作区中的表及记录指针均不发生影响,仅实现各个工作区之间切换。

例2.10 在1号和2号工作区内分别打开商品、供应商和订购单3个表,并选择1号工作区为当前工作区。

SELECT 1          

USE 商品

  SELECT  B

    USE  供应商

   SELECT 3

    USE 订购单

SELECT 1

或:USE 商品 IN 1        

USE 供应商 IN 2

USE 订购单 IN 3

3.非当前工作区字段的引用

Visual FoxPro系统对当前工作区上的表可以进行任何操作,也可以对其他工作区中的表文件的数据进行访问。在主工作区可通过以下两种格式访问其他工作区表中的数据。

格式:<工作区别名>-> <字段名>

      <工作区别名>. <字段名>

通过用工作区别名指定欲访问的工作区,所得到的字段值为指定工作区打开的表当前记录的字段值。

例2.11 在1号和2号工作区打开商品和订购单,在1号工作区内查看当前记录的商品编号、商品名称、订购数量、商品单价等字段内容。

SELECT A

USE 商品       && 在一号工作区中打开商品

SELECT B

USE 订购单     && 在二号工作区中打开订购单

SELECT A       && 选择1号工作区为当前工作区

DISPLAY 商品编号,商品名称,B.订购数量B->商品单价

2.7.2表的关联

表之间的关联

1.关联的概述

      所谓表文件的关联是把当前工作区中打开的表与另一个工作区中打开的表进行逻辑连接,而不生成新的表。当前工作区的表和另一工作区中的打开表建立关联后,当前工作区是表的记录指针移动时,被关联工作区的表记录指针也将自动相应移动,以实现对多个表的同时操作。

在多个表中,必须有一个表为关联表,此表常称为父表,而其他的表则称为被关联表,常称为子表。在两个表之间建立关联,必须以某一个字段为标准,该字段称为关键字段。 

2.表文件关联的建立

【格式】SET RELATION TO <关键字段表达式> INTO<别名> |  <工作区号>] [ADDITIVE]

【功能】将当前工作区的表文件与<别名>(或工作区号)指定的工作区中的表文件按<关键字段表达式>或<数值表达式>建立关联。

【说明】当用<关键字段表达式>建立关联时,关键字必须是两个表文件共有字段,且别名表文件已按关键字段建立了索引文件,并已指定关键字段为当前索引。

     当父表文件的记录指针移动时,子表文件的记录指针根据主索引文件指向关键字段值与父表文件相同的记录。如果子表中没有与关键字段值相同的记录,记录指针指向文件尾,EOF()为.T.。

ADDITIVE:表示当前表与其他工作区表己有的关联仍有效,实现一个表和多个表之间的关联;否则取消当前表与其他工作区表已有的关联,当前表只能与一个表建立关联。

SET  RELATION  TO则表示取消当前工作区与其他工作区的关联。

例2.12 将表文件.DBF和订购单.DBF以商品编号为关键字段建立关联。

SELECT 2                         && 选择工作区2

USE  订购单                      && 打开表文件订购单.DBF

INDEX ON 商品编号 TAG商品编号   && 建立商品编号标识

SET ORDER TO 商品编号            && 指定商品编号为当前索引

SELECT 1                         && 选择工作区1

USE 商品                         && 打开表文件商品.DBF

SET RELATION TO商品编号 INTO 2  && 建立一对一关联

说明:在建立关联之前,必须打开一个表(父表),而且还必须在另一个工作区内打开其它表(子表)。相关的各表通常有一个相同的字段。父表可以同时与多个子表建立关系,称为“一父多子”的关系。<关联表达式>可以是字符型、数值型、日期型表达式。如果建立父子关联之前,子表已经按照关联条件建立了索引,并将该索引文件指定为主控索引,那么,每当当前工作区父表的记录指针重新定位时,就检索子表,将子表的记录指针定位于<关联表达式>值与<索引表达式>值相同的第一条记录之上。

    除了可以在一个工作区中与多个表建立关联以外,还允许在多个工作区中建立多个表之间的关联,但关联不能构成循环。