论文部分内容阅读
摘 要:完整性约束是数据模型的重要组成部分,在应用系统开发中数据库完整性的设计十分重要。本文从实体完整性、参照完整性和用户自定义完整性三方面探讨了数据库完整性理论,并通过实例介绍了在VFP 6.0中数据库完整性的设计。
关键词:数据库;实体完整性;参照完整性;用户自定义完整性
中图分类号:TP311.13文献标识码:A
the Data Integrality of the Visual FoxPro Database
SHANG Jun-ping,LIU He-bing
(Department of Computer Science & technology , Henan Agricultural University , Henan Zhengzhou 450002)
Key words: Database;Entity Integrity;Referential Integrity;User-defined Integrity
完整性约束是数据模型的重要组成部分。完整性约束条件是一组完整性规则的集合。完整性规则是给定的数据模型中数据及其联系所具有的制约和依存规则,用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确性、有效性、相容性。数据库是否具备完整性关系到数据库系统能否真实地反映现实世界,在数据库应用中,如何保证数据的完整性是非常重要的。
数据库完整性包括实体完整性、参照完整性和用户自定义完整性三方面,数据库完整性设计是数据库原理与应用课程教学中的重要内容。本文以学生-课程-成绩数据库从这三个方面讨论基于VFP的数据库完整性设计。该数据库中包括三个数据表,关系模式分别为:学生(学号,姓名,性别,年龄,所在系),课程(课程号,课程名,先修课程号,学分,周学时),成绩(学号,课程号,成绩)。
1 实体完整性
实体完整性即关系中的记录唯一性,准确地讲就是指关系中的主属性不能为空值,不能有相同值。在VFP 6.O中利用主关键字或候选关键字来保证表中记录的唯一。比如:学号能唯一标识一个学生,在学生表中学号字段就可以作为主关键字或候选关键字。一个表中只能有一个主关键字,可以有多个候选关键字。主关键字或候选关键字的设定通过定义主索引或候选索引实现,一旦定义为主关键字或候选关键字,该关键字的每个属性就不能为空值,并且在关系中不能出现关键字值完全相同的两个元组。
可以在表设计器中进行定义,在表设计器"索引"选项卡中定义索引名、索引类型及索引表达式。按主关键字字段建立主索引,按候选关键字建立候选索引。
也可以使用SQL的Create Table命令在建立表文件时指定主关键字或候选关键字实现数据的实体完整性,定义的方法:主关键字的定义是在Create Table语句中在属性定义后加上关键字Primary Key,只能对数据库表文件定义主关键字;建立候选关键字在属性定义后加关键字Unique。
例如,建立自由表"学生",学号为候选关键字,命令为:create table 学生(学号 c(10) unique,姓名 c(8), 性别 c(2),年龄n(3),所在系 c(16))。
在数据库中建立学生表,学号为主关键字,命令为:create table 学生(学号 c(10) primary key,姓名 c(8), 性别 c(2),年龄n(3),所在系 c(16))。
在VFP 6.O中并没有强制为每个表文件指定关键字,但关键字的指定可以确保数据的实体完整性。
2 参照完整性
参照完整性,是用来控制数据一致性,尤其是控制数据库相关表之间的主关键字和外部关键字之间数据一致性的规则。例如,在学生表中删除了一个学生,那么在成绩表中这个学生的成绩也就没有意义,也应该自动删除掉。或者,在学生表中修改某个学生的学号信息,在成绩表中也应该自动修改,参照完整性设计就是为了实现这样的功能。
在VFP 6.O中建立参照完整性的步骤如下:首先,建立表之间的关系。需要在父表、子表中建立索引,并且父表必须为主索引或候选索引,在数据库设计器中通过父表和子表间的索引建立关系。其次,设置参照完整性约束。设置参照完整性之前,应先清理数据库。清理数据库是物理删除数据库各个表中所有带有删除标记的记录。设定数据库设计器为当前窗口,在“数据库”菜单下选择“清理数据库”。清理数据库后,即可设置参照完整性约束。用鼠标右键单击表之间的关系,从快捷菜单中选择“编辑参照完整性”打开参照完整性生成器的对话框,定义两个表之间的更新、删除和插入规则。参照完整性生成器界面如图1所示。

图1 参照完整性生成器界面
参照完整性规则包括:
更新规则:指定修改父表中关键字的值时所用的规则。
删除规则:指定删除父表中的记录时所用的规则。
插入规则:指定在子表中插入新记录,或更新原有记录时所用的规则。
每一种规则可能有“级联”、“限制”或“忽略”,具体说明见表1。当用户操作违反了约束规则时,通过定义限制、级联、忽略来保持约束。
表1 参照完整性规则

图1中的表格说明了表间关系及参照完整性规则的设定情况。其中父表列、子表列分别显示联接表的父表名、子表名;更新列、删除列和插人列则显示所选定选项按钮的名称,若单击这些列的单元格,会出现一个组合框,供用户选择级联、限制和忽略等功能;父标记、子标记列分别显示父表和子表的索引标识名。
更新、删除、插入这三种规则的默认值都是“忽略”。一般情况下,更新、删除和插入规则分别选择“级联”、“级联”、“限制”,参照完整性规则被设置在父表或者子表的触发器中,系统为规则生成的代码保存在数据库的存储过程中。图2(a)中列出了学生表和成绩表的原始数据,图2(b)为更新规则为"限制",试图在学生表中修改“s1”为“s11”时发生触发器失败的信息。

(a)原始数据 (b)更新时发生触发器失败
图2 更新数据触发器失败
当更改数据库表或改变了在关系中使用的索引时,应在使用数据库之前重新运行参照完整性生成器,以便将修改存储过程代码和那些实施参照完整性的表触发器,从而反映最新情况。
3 用户自定义完整性
任何关系数据库系统都应支持实体完整性和参照完整性。此外,应用系统中往往还需要定义与应用有关的完整性限制,即用户自定义完整性。用户自定义完整性是针对某一具体关系数据库的约束规则,这些规则只在数据库表中存在,反映某一具体应用所涉及的数据必须满足语义的要求。根据激活方式的不同,有效性规则包括字段级有效性规则和记录级有效性规则。
3.1 设置字段级有效性规则
字段级有效性规则是对一个字段的约束,用来检查单个字段的数据是否有效。数据库表中每一个字段都有一个定义域,输入的数据必须在定义域之内。建立数据库表时对字段的描述,包括数据类型,宽度,小数点位等也属于基本的完整性控制。在此基础上,还可进一步对字段设置规则。在VFP 6.0中打开表设计器,例如学生表,“字段”选项卡上有“显示”和“字段有效性”选项区,如图3所示。

图3 字段有效性规则设置界面
“显示”选项区的“格式”文本框用开输入格式功能符,确定整个字段在浏览窗口,表单或报表中显示时采用样式限制。例如输入字母A表示仅允许输入字母,T标示禁止输入字段的前导空格字符和结尾空格字符。“输入掩码”文本框用于指定字段值的输入格式,控制输入的正确性。输入掩码必须按位来指定格式,例如99-999,编号字段对应9的位必须输入数字。“标题”文本框用于设置对应字段的长标题显示,加强对数据库表的安全保护。
字段有效性区包含“规则”、“信息”、“默认值”三个文本框,各文本框均可直接输入数据,也可以通过其右边的对话按钮打开表达式生成器进行设置。
“规则”文本框用于定义对字段数据有效性进行检查的规则,它实际上是一个条件,例如图3中的性别=“男”.or. 性别=“女”,它表明性别字段的输入值只能是“男”或“女”。对于在该字段输入的数据,VFP 6.0会自动检查它是否符合条件,若不符合条件必须进行修改,直至与条件符合才允许光标离开该字段。
“信息”文本框用于指定出错误提示信息,当该字段输入的数据违反条件时,出错信息将显示,如图3中的“你的输入有错误!”。需要注意的是,输入到信息文本框中的信息,要用定界符(单引号,双引号或中括号)括起来。
“默认值”是在用户没有给该字段确定值时,系统自动设定的内容,可提高输入速度。
在VFP 6.0中也可以使用SQL的Create Table命令在建表时使用Check指定字段值满足的条件。例如,在数据库中新建“学生”表,性别字段的值只能是“男”或“女”,命令为:create table学生(学号 c(10),姓名 c(8), 性别 c(2) check 性别=“男”.or. 性别=“女”,年龄n(3),所在系 c(16))。
3.2 设置记录有效性规则
记录级有效性规则是对一个记录的约束,当插入或修改记录时被激活,它通常比较同一记录中的两个或多个字段值,看它们组合在一起是否有效。以课程表为例,打开表设计器,选择“表”选项卡,有“记录有效性”和“触发器”选项区。如图4所示。
记录有效性规则的设置和字段有效性规则相似,记录有效性规则只有在整条记录输入完毕后才开始检查数据的有效性。例如可以使用记录级有效性规则来保证“课程”表中的“周课时”字段值大于“学分”字段的值。也可以使用Alter Table命令中的Set check子句设置记录级有效性规则,如图4的记录有效性规则可以用命令来添加,命令为:alter table 课程 set check 周课时>学分。

图4 记录有效性规则设置界面
对于每个表,在VFP 6.0中定义了三个事件触发器:插入触发器,更新触发器,删除触发器。触发器表达式必须为一个逻辑表达式,用于指定进行相应操作时的规则,返回只能是真(.T.)或假(.F.)。如图4中删除触发器中的表达式为“EMPTY(课程名)”,表示只有当相应记录的"课程名"字段为空时才能删除该记录,每次在表中删除记录时该规则被触发,检查是否满足条件。触发器是作为数据库表的属性而存在的,如果用户将一个表从数据库中移走,与这个表相关的触发器也将被删除。
4 结束语
本文从实体完整性、参照完整性和用户自定义完整性三方面探讨了基于VFP的数据库完整性设计。实体完整性的设置确保数据库表记录的唯一性,参照完整性则对数据库表间关系进行检查,通过规则约束来确保表之间的数据的一致性,用户自定义完整性对数据库表中字段和记录进行有效性检查。数据库完整性规则的设计,充分地保证数据的正确性、有效性和相容性。
参考文献:
[1]王珊,萨师煊.数据库系统概论[M].北京:高等教育出版社,2006.
[2]刘瑞新,汪远征.Visual FoxPro程序设计教程[M].北京:电子工业出版社,2006.
[3]肖慎勇.数据库及其应用[M].北京:清华大学出版社,2007.
[4]刘特,徐迎晓,李敏等. 在关系数据库中构建数据完整性的检验策略[J].计算机工程,2002(11):87-89.
[5]张峰,张莉莉.触发器在数据处理过程中的应用研究[J].计算机工程与科学,2008,(5):156-158.
关键词:数据库;实体完整性;参照完整性;用户自定义完整性
中图分类号:TP311.13文献标识码:A
the Data Integrality of the Visual FoxPro Database
SHANG Jun-ping,LIU He-bing
(Department of Computer Science & technology , Henan Agricultural University , Henan Zhengzhou 450002)
Key words: Database;Entity Integrity;Referential Integrity;User-defined Integrity
完整性约束是数据模型的重要组成部分。完整性约束条件是一组完整性规则的集合。完整性规则是给定的数据模型中数据及其联系所具有的制约和依存规则,用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确性、有效性、相容性。数据库是否具备完整性关系到数据库系统能否真实地反映现实世界,在数据库应用中,如何保证数据的完整性是非常重要的。
数据库完整性包括实体完整性、参照完整性和用户自定义完整性三方面,数据库完整性设计是数据库原理与应用课程教学中的重要内容。本文以学生-课程-成绩数据库从这三个方面讨论基于VFP的数据库完整性设计。该数据库中包括三个数据表,关系模式分别为:学生(学号,姓名,性别,年龄,所在系),课程(课程号,课程名,先修课程号,学分,周学时),成绩(学号,课程号,成绩)。
1 实体完整性
实体完整性即关系中的记录唯一性,准确地讲就是指关系中的主属性不能为空值,不能有相同值。在VFP 6.O中利用主关键字或候选关键字来保证表中记录的唯一。比如:学号能唯一标识一个学生,在学生表中学号字段就可以作为主关键字或候选关键字。一个表中只能有一个主关键字,可以有多个候选关键字。主关键字或候选关键字的设定通过定义主索引或候选索引实现,一旦定义为主关键字或候选关键字,该关键字的每个属性就不能为空值,并且在关系中不能出现关键字值完全相同的两个元组。
可以在表设计器中进行定义,在表设计器"索引"选项卡中定义索引名、索引类型及索引表达式。按主关键字字段建立主索引,按候选关键字建立候选索引。
也可以使用SQL的Create Table命令在建立表文件时指定主关键字或候选关键字实现数据的实体完整性,定义的方法:主关键字的定义是在Create Table语句中在属性定义后加上关键字Primary Key,只能对数据库表文件定义主关键字;建立候选关键字在属性定义后加关键字Unique。
例如,建立自由表"学生",学号为候选关键字,命令为:create table 学生(学号 c(10) unique,姓名 c(8), 性别 c(2),年龄n(3),所在系 c(16))。
在数据库中建立学生表,学号为主关键字,命令为:create table 学生(学号 c(10) primary key,姓名 c(8), 性别 c(2),年龄n(3),所在系 c(16))。
在VFP 6.O中并没有强制为每个表文件指定关键字,但关键字的指定可以确保数据的实体完整性。
2 参照完整性
参照完整性,是用来控制数据一致性,尤其是控制数据库相关表之间的主关键字和外部关键字之间数据一致性的规则。例如,在学生表中删除了一个学生,那么在成绩表中这个学生的成绩也就没有意义,也应该自动删除掉。或者,在学生表中修改某个学生的学号信息,在成绩表中也应该自动修改,参照完整性设计就是为了实现这样的功能。
在VFP 6.O中建立参照完整性的步骤如下:首先,建立表之间的关系。需要在父表、子表中建立索引,并且父表必须为主索引或候选索引,在数据库设计器中通过父表和子表间的索引建立关系。其次,设置参照完整性约束。设置参照完整性之前,应先清理数据库。清理数据库是物理删除数据库各个表中所有带有删除标记的记录。设定数据库设计器为当前窗口,在“数据库”菜单下选择“清理数据库”。清理数据库后,即可设置参照完整性约束。用鼠标右键单击表之间的关系,从快捷菜单中选择“编辑参照完整性”打开参照完整性生成器的对话框,定义两个表之间的更新、删除和插入规则。参照完整性生成器界面如图1所示。

图1 参照完整性生成器界面
参照完整性规则包括:
更新规则:指定修改父表中关键字的值时所用的规则。
删除规则:指定删除父表中的记录时所用的规则。
插入规则:指定在子表中插入新记录,或更新原有记录时所用的规则。
每一种规则可能有“级联”、“限制”或“忽略”,具体说明见表1。当用户操作违反了约束规则时,通过定义限制、级联、忽略来保持约束。
表1 参照完整性规则

图1中的表格说明了表间关系及参照完整性规则的设定情况。其中父表列、子表列分别显示联接表的父表名、子表名;更新列、删除列和插人列则显示所选定选项按钮的名称,若单击这些列的单元格,会出现一个组合框,供用户选择级联、限制和忽略等功能;父标记、子标记列分别显示父表和子表的索引标识名。
更新、删除、插入这三种规则的默认值都是“忽略”。一般情况下,更新、删除和插入规则分别选择“级联”、“级联”、“限制”,参照完整性规则被设置在父表或者子表的触发器中,系统为规则生成的代码保存在数据库的存储过程中。图2(a)中列出了学生表和成绩表的原始数据,图2(b)为更新规则为"限制",试图在学生表中修改“s1”为“s11”时发生触发器失败的信息。

(a)原始数据 (b)更新时发生触发器失败
图2 更新数据触发器失败
当更改数据库表或改变了在关系中使用的索引时,应在使用数据库之前重新运行参照完整性生成器,以便将修改存储过程代码和那些实施参照完整性的表触发器,从而反映最新情况。
3 用户自定义完整性
任何关系数据库系统都应支持实体完整性和参照完整性。此外,应用系统中往往还需要定义与应用有关的完整性限制,即用户自定义完整性。用户自定义完整性是针对某一具体关系数据库的约束规则,这些规则只在数据库表中存在,反映某一具体应用所涉及的数据必须满足语义的要求。根据激活方式的不同,有效性规则包括字段级有效性规则和记录级有效性规则。
3.1 设置字段级有效性规则
字段级有效性规则是对一个字段的约束,用来检查单个字段的数据是否有效。数据库表中每一个字段都有一个定义域,输入的数据必须在定义域之内。建立数据库表时对字段的描述,包括数据类型,宽度,小数点位等也属于基本的完整性控制。在此基础上,还可进一步对字段设置规则。在VFP 6.0中打开表设计器,例如学生表,“字段”选项卡上有“显示”和“字段有效性”选项区,如图3所示。

图3 字段有效性规则设置界面
“显示”选项区的“格式”文本框用开输入格式功能符,确定整个字段在浏览窗口,表单或报表中显示时采用样式限制。例如输入字母A表示仅允许输入字母,T标示禁止输入字段的前导空格字符和结尾空格字符。“输入掩码”文本框用于指定字段值的输入格式,控制输入的正确性。输入掩码必须按位来指定格式,例如99-999,编号字段对应9的位必须输入数字。“标题”文本框用于设置对应字段的长标题显示,加强对数据库表的安全保护。
字段有效性区包含“规则”、“信息”、“默认值”三个文本框,各文本框均可直接输入数据,也可以通过其右边的对话按钮打开表达式生成器进行设置。
“规则”文本框用于定义对字段数据有效性进行检查的规则,它实际上是一个条件,例如图3中的性别=“男”.or. 性别=“女”,它表明性别字段的输入值只能是“男”或“女”。对于在该字段输入的数据,VFP 6.0会自动检查它是否符合条件,若不符合条件必须进行修改,直至与条件符合才允许光标离开该字段。
“信息”文本框用于指定出错误提示信息,当该字段输入的数据违反条件时,出错信息将显示,如图3中的“你的输入有错误!”。需要注意的是,输入到信息文本框中的信息,要用定界符(单引号,双引号或中括号)括起来。
“默认值”是在用户没有给该字段确定值时,系统自动设定的内容,可提高输入速度。
在VFP 6.0中也可以使用SQL的Create Table命令在建表时使用Check指定字段值满足的条件。例如,在数据库中新建“学生”表,性别字段的值只能是“男”或“女”,命令为:create table学生(学号 c(10),姓名 c(8), 性别 c(2) check 性别=“男”.or. 性别=“女”,年龄n(3),所在系 c(16))。
3.2 设置记录有效性规则
记录级有效性规则是对一个记录的约束,当插入或修改记录时被激活,它通常比较同一记录中的两个或多个字段值,看它们组合在一起是否有效。以课程表为例,打开表设计器,选择“表”选项卡,有“记录有效性”和“触发器”选项区。如图4所示。
记录有效性规则的设置和字段有效性规则相似,记录有效性规则只有在整条记录输入完毕后才开始检查数据的有效性。例如可以使用记录级有效性规则来保证“课程”表中的“周课时”字段值大于“学分”字段的值。也可以使用Alter Table命令中的Set check子句设置记录级有效性规则,如图4的记录有效性规则可以用命令来添加,命令为:alter table 课程 set check 周课时>学分。

图4 记录有效性规则设置界面
对于每个表,在VFP 6.0中定义了三个事件触发器:插入触发器,更新触发器,删除触发器。触发器表达式必须为一个逻辑表达式,用于指定进行相应操作时的规则,返回只能是真(.T.)或假(.F.)。如图4中删除触发器中的表达式为“EMPTY(课程名)”,表示只有当相应记录的"课程名"字段为空时才能删除该记录,每次在表中删除记录时该规则被触发,检查是否满足条件。触发器是作为数据库表的属性而存在的,如果用户将一个表从数据库中移走,与这个表相关的触发器也将被删除。
4 结束语
本文从实体完整性、参照完整性和用户自定义完整性三方面探讨了基于VFP的数据库完整性设计。实体完整性的设置确保数据库表记录的唯一性,参照完整性则对数据库表间关系进行检查,通过规则约束来确保表之间的数据的一致性,用户自定义完整性对数据库表中字段和记录进行有效性检查。数据库完整性规则的设计,充分地保证数据的正确性、有效性和相容性。
参考文献:
[1]王珊,萨师煊.数据库系统概论[M].北京:高等教育出版社,2006.
[2]刘瑞新,汪远征.Visual FoxPro程序设计教程[M].北京:电子工业出版社,2006.
[3]肖慎勇.数据库及其应用[M].北京:清华大学出版社,2007.
[4]刘特,徐迎晓,李敏等. 在关系数据库中构建数据完整性的检验策略[J].计算机工程,2002(11):87-89.
[5]张峰,张莉莉.触发器在数据处理过程中的应用研究[J].计算机工程与科学,2008,(5):156-158.