第1章实验
本章代码下载:DBApp-Lab1.rar
实验 1-1 Visual FoxPro中参照完整性的设置及数据操作顺序
【步骤1】建立索引
1. 启动Visual FoxPro 8.0,在Command(命令)窗口中输入命令"SET EXCLUSIVE ON"并回车,该命令确保以独占方式访问表和数据库。
2. 选择菜单File | Open…,在弹出的对话框中打开SampleCode\Chapter 1\Lab 1-1\RI\RI.pjx(若出现提示"Project has been movied…..",请按"Yes"按钮以确认路径更改)。
3. 在出现的Project Manager窗口中选择Data页面,依次展开左侧树型结构中的Databases | testdb | Tables,选择student表,并单击右侧Modify按钮打开Table Designer窗口。
4. 窗口左侧有4个字段,选中id字段,并设置Index下拉列表的值为Ascending。如图 1-3:
图 1-3 选择索引顺序
5. 同样道理,选择deptid字段,并设置Index为Ascending。
6. 切换到Indexes页面,可以看到建立在字段id与deptid上的索引已经列出。从id的Type下拉列表中选择索引类型为Primary主索引。如图 1-4。
图 1-4 设置主索引
7. 切换到Table页面,观察右侧Triggers(触发器)区域内插入触发器、删除触发器以及更新触发器均为空。
8. 单击"OK"按钮,单击"Yes"按钮。
9. 在Project Manager窗口选中dept表,单击Modify按钮,打开dept表的Table Designer窗口。
10. 设置deptid字段Index为Ascending,切换到Indexes页面,设置deptid索引为Primary类型的索引,单击OK,单击Yes。
【步骤2】观察没有参照完整性约束时表的行为
11. 观察左侧树形结构中Stored Procedures结点下目前没有任何内容。
12. 选中左侧dept表,并单击右侧Browse按钮,再选中student表,单击Browse按钮,这样我们就同时打开了表dept与student的浏览窗口。用鼠标将这两个窗口排列整齐,能够同时显示在你的视线当中。
13. 在dept表的第一行左侧白色小方块中单击,使其变成黑色(这在Visual FoxPro中表示将该行逻辑删除)。用鼠标单击student表的浏览窗口使其获得焦点,观察左侧没有变黑的小方块(表示没有级联删除)。如图 1-5:
图 1-5 Dept与Student无级联删除关系
14. 切换到dept表,在黑色块上单击,使其重新变为白色(表示恢复逻辑删除的记录)。关闭两个浏览窗口。
【步骤3】设置参照完整性规则
15. 在左侧树形结构中单击选中testdb,然后单击Modify按钮,打开testdb的DataBase Designer窗口。我们可以看到在两张表的下方显示了我们建立的索引,并且主索引前面有一把小钥匙。
16. 用鼠标在dept表的deptid索引上按下并拖动到student表的deptid索引上(注意方向不要弄反,另外一定是拖动deptid索引而不是deptid字段),于是两表之间就建立起了一对多的永久性关联关系。如图 1-6:
图 1-6 建立永久性关联关系
17. 在建立起来的永久性关联关系实线上右击,并在弹出的快捷菜单中选择Edit Referential Integrity…,打开Referential Integrity Builder窗体,如图 1-7:
图 1-7 编辑参照完整性
18. 将Rules for Updating(更新规则)设置为Restrict(限制),切换到Rules for Deleting(删除规则)页面,设置成Cascade(级联),然后再切换到Rules for Inserting(插入规则)页面,设置插入规则为Restrict。单击OK按钮,在弹出的询问是否生成存储过程以及是否保留旧存储过程的消息框中选择Yes。
19. 经过短暂的生成工作后,系统询问"数据库已被修改或删除,是否重新载入?",选择Yes。
20. 关闭DataBase Designer窗口。
【步骤4】观察参照完整性约束行为
21. 依次展开左侧树型结构中的Databases | testdb | Tables,选中左侧dept表,并单击右侧Browse按钮,再选中student表,单击Browse按钮同时打开dept与student表的浏览窗口。用鼠标将这两个窗口排列整齐,能够同时显示在你的视线当中。
22. 在dept表的第一行左侧白色小方块中单击,使其变成黑色。用鼠标单击student表的浏览窗口使其获得焦点,观察系别代号为1的行左侧小方块自动变黑块,由此我们可见实现了级联删除。如图 1-8:
图 1-8 参照完整性确保了级联删除
23. 在dept表中将机械系的deptid字段值改为4后,并移动记录指针(在移动记录指针时,Visual FoxPro试图更新更新表,并触发参照完整性校验),此时会弹出一警告框,告诫无法更改Deptid字段。这是因为更新规则为"限制更新",当Student表中有学生是机械系时,就无法更改Dept表中机械系的Deptid字段值。
24. 切换到Student表,选择菜单View | Append Mode,进入追加状态,为Student输入一行新记录:Id:5,Name:和二,Age:25,Deptid:9,并移动记录指针,系统再次弹出警告框,这是因为插入规则为限制插入,我们不能插入一学生,其系号在系别表中不存在。
25. 重复上一步,将Deptid字段设置为3,观察该记录很好的插入到表当中。
【步骤5】探究Visual FoxPro参照完整性实现原理
26. 在Project Manager窗口中单击选中dept表,单击右侧Modify按钮,打开的Table Designer窗口。切换到Table页面,观察右侧Triggers(触发器)区域内更新触发器以及删除触发器中被填入了"__ri_update_dept()"与"__ri_delete_dept()",同样在student表中可以发现插入触发器以及更新触发器中被填入了"__ri_insert_student()"与"__ri_update_student()",这四个方法是对存储过程的调用,以实现刚才看到的级联删除、限制更新以及限制插入。
27. 关闭表设计器窗口。在Project Manager窗口展开左侧Stored Procedures结点,可以看到系统自动添加了多个存储过程。单击右侧Modify按钮可查看系统自动生成的程序代码。Visual FoxPro在用户执行删除(更新、插入)时会自动触发删除(更新、插入)触发器,并调用执行相应的存储过程,由存储过程实现相应的参照完整性规则校验。
28. 关闭所有窗口。
29. 关闭Visual FoxPro。
实验 1-2 在Visual FoxPro中实现字段级完整性约束
1. 启动Visual FoxPro 8.0,在Command(命令)窗口中输入命令"SET EXCLUSIVE ON"并回车,该命令确保以独占方式访问表和数据库。
2. 选择菜单File | Open…,在弹出的对话框中打开SampleCode\Chapter 1\Lab 1-2\ FieldValidation\FieldValidation.pjx(若出现提示"Project has been movied…..",请按"Yes"按钮以确认路径更改)。
3. 在出现的Project Manager窗口中选择Data页面,依次展开左侧树型结构中的Databases | testdb | Tables,选择teacher表,并单击右侧Browse按钮,打开浏览窗口。
4. 试试将张三的年龄改为-5并移动记录指针,可以看到-5被保存到了数据库中。
5. 将张三的年龄改回50,并关闭浏览窗口。
6. 选中左侧teacher表并单击右侧Modify按钮打开Table Designer窗口。
7. 选中左侧的"年龄"字段,并设置右侧Field Validation中Rule为"年龄=>0.AND.年龄<=150",Message为""年龄必须是0~150之间的整数!""(注意不要漏掉里面的双引号,并且引号为半角引号)。
8. 选中左侧的"工龄"字段,并设置右侧Field Validation中Rule为"工龄=>0.AND.工龄<=50",Message为""工龄必须是0~50之间的整数!""(注意不要漏掉里面的双引号,并且引号为半角引号)。
9. 单击OK按钮关闭Table Designer窗口。
10. 单击右侧Browse按钮,打开浏览窗口,试试将张三的年龄改为-5并移动记录指针,是否仍然可以保存。再尝试将工龄改为70是否可行。
11. 关闭所有窗口。
12. 关闭Visual FoxPro。
实验 1-3 在Visual FoxPro中实现记录级完整性约束
1. 启动Visual FoxPro 8.0,在Command(命令)窗口中输入命令"SET EXCLUSIVE ON"并回车,该命令确保以独占方式访问表和数据库。
2. 选择菜单File | Open…,在弹出的对话框中打开SampleCode\Chapter 1\Lab 1-3\ RecordValidation\RecordValidation.pjx(若出现提示"Project has been movied…..",请按"Yes"按钮以确认路径更改)。
3. 在出现的Project Manager窗口中选择Data页面,依次展开左侧树型结构中的Databases | testdb | Tables,选择teacher表,并单击右侧Browse按钮,打开浏览窗口。
4. 试试将赵六的工龄改为30并移动记录指针,可以看到数据被成功保存到表中,然而一个人工龄是不可能比年龄还大的。
5. 将赵六的工龄改回4,并关闭浏览窗口。
6. 选中左侧teacher表并单击右侧Modify按钮打开Table Designer窗口。
7. 切换到Table页面,在Record Validation下的Rule中填入"工龄=0.OR.年龄-工龄=>18",在Message中填入""只有满18岁才可以工作!""(注意不要漏掉里面的双引号,并且引号为半角引号)。
8. 单击OK按钮关闭Table Designer窗口。
9. 单击右侧Browse按钮,打开浏览窗口,试试将赵六的工龄改为30并移动记录指针,观察是否仍然可以保存。
10. 关闭所有窗口。
11. 关闭Visual FoxPro。