170 likes | 355 Views
第 3 章 数据库与表的的创建和使用. 淮海工学院计算机系. 3.4 永久关系与参照完整性. 表之间的关系 ( 1 )一对一关系 ( 2 )一对多关系(学生表与成绩表) ( 3 )多对多关系(学生表与课程表) 注:在实际应用中,多对多关系不能直接应用,必须建立第三张表,把多对多关系分解成两个一对多关系 明确表之间的关系,是数据库开发的基础. 3.4 永久关系与参照完整性. 永久关系:是在数据库表之间的一种关系,这种关系不仅在运行时存在,而且一直保持。 数据库表间的永久关系是根据 表的索引 建立的。 为数据库表建立永久关系的作用:
E N D
第3章 数据库与表的的创建和使用 淮海工学院计算机系
3.4 永久关系与参照完整性 • 表之间的关系 • (1)一对一关系 • (2)一对多关系(学生表与成绩表) • (3)多对多关系(学生表与课程表) • 注:在实际应用中,多对多关系不能直接应用,必须建立第三张表,把多对多关系分解成两个一对多关系 • 明确表之间的关系,是数据库开发的基础
3.4永久关系与参照完整性 • 永久关系:是在数据库表之间的一种关系,这种关系不仅在运行时存在,而且一直保持。 • 数据库表间的永久关系是根据表的索引建立的。 • 为数据库表建立永久关系的作用: • (1)在“查询设计器”窗口中,自动作为默认联接条件; • (2)作为表单和报表的默认关系; • (3)用来存储参照完整性信息。
3.4永久关系与参照完整性 • 创建永久关系的操作方法: (1)确定两张具有一对一或一对多关系的表。 (2)建立主表的主索引或候选索引。 (3)如果是一对一关系,则在子表中以与主表相同的关键字建立主索引或候选索引;如果是一对多关系,则在子表中以主表的主关键字为该表的外部关键字建立普通索引。 (4)在“数据库设计器”窗口中,将主表的主索引或候选索引拖放到子表相应的索引标识上,则完成了永久关系的设置。
3.4永久关系与参照完整性 • 参照完整性:是用来控制数据的完整性,尤其是控制数据库中相关表之间的主关键字和外部关键字之间数据一致性的规则。 • 目的:在一对多关系中,当用户对主表进行添加,修改或删除时,可能会使子表中的记录成为“孤立数据”,为防止此情况发生,可通过设置参照完整性规则来约束。 • 方法:在“数据库设计器”窗口中右击关系连线,在出现的快捷菜单中选择“参照完整性”菜单命令。
3.4永久关系与参照完整性 • 参照完整性规则包括更新规则,删除规则和插入规则三种。每一种规则又有“级联”,“限制”和“忽略”三个级别。
3.4永久关系与参照完整性 • 注:利用“参照完整性生成器”对话框设置参照完整性规则时,系统会自动生成完成该规则的程序代码,规则的代码被保存在数据库的存储过程中。
3.4.3 数据完整性综述 • VFP引进了关系型数据库的三类完整性:实体完整性,参照完整性和用户自定义完整性。 • 实体完整性包括两级:字段的数据完整性和记录的数据完整性。 • 参照完整性是指相关表之间的数据一致性。 • 用户自定义完整性是指用户通过编写的程序代码来控制数据的完整性。 • 总结:通过字段级,记录级和表间三级完整性约束,有效地实现了数据的完整性和一致性,从而方便用户的数据维护。
3.5 有关表操作的常用函数 • BOF([<工作区号或别名>]):指定的工作区中库文件记录指针是否指向起始位置。是函数值为逻辑真(.T.),否则为假(.F.)。EOF([<工作区号或别名>]):指定工作区中库文件记录指针是否指向结束位置。是函数值为逻辑真(.T.),否则函数值为假(.F.)。RECNO([<工作区号或别名>]):测试当前或指定工作区表的当前记录号 • DELETED([<工作区号或别名>]):记录删除测试函数 • FILE(<"字符串">):测试文件是否存在函数 • DBF([<工作区号或别名>]):返回指定工作区中数据表的文件名。
SELECT():当前工作区测试函数。 • USED():测试表是否打开函数。 • ALIAS():返回指定工作区中数据表的别名。 • FIELD(expN1[,expN|expC]):返回指定工作区数据表第expN1个字段名。 • FCOUNT():返回指定工作区中数据表的字段数。 • DELETE():测试当前记录是否加删除标记。
记录测试函数 RECOUNT([数值型表达式])测试<数值表达式>指定的工作区中数据库的记录个数。 • DBC():返回当前打开的数据库的完整文件名,无参数。 • DBUSED():返回指定数据库文件是否已经打开的状态。 • DBGETPROP(cName,cType,cProperty):返回当前数据库的属性。 • DBSETPROP(cName,cType,cProperty,ePropertyValue):设置当前数据库的属性。
测试题 • 按如下要求修改example中学生表(表xs)的结构: (1)增加一个字段:indate,日期型 (2)将indat字段的标题设置为:入学日期,默认值设为:2004/09/01 (3)设置indate字段的有效性规则:入学年份不能超过当年年份,且不能在2001年之前。 (4)设置indate字段的有效性信息:入学时间无效 (5)学号(xh)字段设置输入格式:删除输入字段前导空格。 (6)创建一个普通索引age,要求先按出生日期排序,csrq相同的再按学号排,按年龄从小到大排。 (7)为表xs设置表名:学生信息表,并为表加注释:淮工学生表
2.把练习盘所在目录下的表文件KCB.DBF添加到TEST项目中的自由表,并为KCB表加一条记录。2.把练习盘所在目录下的表文件KCB.DBF添加到TEST项目中的自由表,并为KCB表加一条记录。 3.将GongZi表中所有教授的基本工资增加200,其他人加115. 4.将项目中的程序文件sjmain.prg设置为主文件,为其添加说明信息:该文件是入口。 5.在项目信息设置中,把作者设置为施珺,把单位设置为淮工,把附加图标设为qq.icq. 6.在example中,为表ZY建立主索引zydh,索引表达式为zydh,为表RK建立普通索引zydh,索引表达式为zydh。以表ZY为主表,按zydh建立永久关系,并设置表ZY和表RK之间的参照完整性:更新级联。
自测题二 • 1.按如下要求修改example中课程表(表KC)的结构 (1)修改字段xf的宽度,使之能容纳1位整数和1位小数 (2)将bxk字段的标题设置为:是否必修课;默认值设为:T;显示类设置为:复选框;并加字段注释:T表示必修课,F表示非必修课。 (3)设置kcdh字段的输入掩码:接受4个字节的字符,且第一个字符必须为大写英文字母,后3个字符只接受数字字符。 (4)设置表KC的记录有效性规则:必修课的课时数不得低于48,非必修课的课时数不得超过48,该规则不应用于表中现有记录。 (5)设置表KC的记录有效性信息:必修课的课时数不得低于48,非必修课的课时数不得超过48。 (6)创建一个普通索引ksxf:要求先按课时数(kss)排序,kss相同的再按学分xf排序,按课时数从多到少排列。
2.把数据库example中的GZ表变成TEST项目中的自由表,并将其中所有讲师的基本工资(jbgz)增加10%,所有教授的基本工资增加8%。2.把数据库example中的GZ表变成TEST项目中的自由表,并将其中所有讲师的基本工资(jbgz)增加10%,所有教授的基本工资增加8%。 3.在数据库example中,将表CJ中所有学号为“030301”的记录物理删除。 4.为表XS设置更新触发器:仅允许更新jg为“江苏南京”的学生记录。 5.在数据库example中,将表XIM设置为包含。 6.在example中,为表XS建立主索引xsxh,索引表达式为xh;为表KC建立主索引kcdh,索引表达式为kcdh;为表CJ建立两个普通索引,一个索引名为cjxh,索引表达式为xh,另一个索引名为kch,索引表达式为kcdh。以表XS为主表,按xh建立永久关系,并设置表XS和表CJ之间的参照完整性为:删除级联;以表KC为主表,按kcdh建立永久关系,设表KC和表CJ之间的参照完整性为:插入限制。
有效性规则设置举例 • “性别只能为男或女” • “姓名的有效宽度必须4个字节以上,且首字符必须为汉字” • “年龄在18到22岁之间” • “工作日期必须在1960年以后” • “学分应大于0” • “课时数大于等于2并且小于等于6” • “职称只可以为教授,副教授或讲师”
练习1 • 强化指导P280 • 强化指导P282 • 强化指导P284