SQL-Server实验讲义
Cpno char(4) ,
Ccredit int check (Ccredit >=0 and Ccredit<=5),
check( cno<>cpno) , --约束 primary key (cno) )
create table SC( Sno char(6), Cno char(4) ,
Grade int check(grade<=100) ,
constraint pk_sc primary key (sno,cno), foreign key (sno) references student(sno) , foreign key (cno) references course(cno) , )
二 使用 SP_HELP 查看表 student 的主码名,约束名,并记录。
使用 SP_HELP 查看表 sc 的主码名,外码名,并记录。
三 利用alter table 添加、删除完整性约束
1 删除 SC 的主码,sc表的主码名为 pk_sc ALTER TABLE sc DROP pk_sc
复习在 Sql-Server 企业管理器中如何完成。 2 删除 SC 表参照 course 表的外码。
如何知道 SC表参照 course 表的外码的名字。
1) SP_HELP course 找到外码名 ,假设为: fk_sc_cno_02938
2) ALTER TABLE sc DROP fk_sc_cno_02938
3 添加 SC 表的主码。主码名为 PK_SC
ALTER TABLE sc ADD CONSTRAINT pk_sc PRIMARY KEY (sno,cno)
4 添加 SC 表的Cno 的外码 ,参照表Course的Cno.
ALTER TABLE sc ADD FOREIGN KEY (cno) REFERENCES course(cno) 5加自定义约束:表 SC的成绩只能在 0 – 100分之间。 ALTER TABLE sc ADD check(grade>=0 and grade<=100)
四 使用 Sql-Server 企业管理器完成: 1 删除 SC 表参照 course 表的外码。
2 建立 SC 表的Cno 的外码 ,参照表Course的Cno. *使该外码具有级联修改的功能。
3 删除表 SC的成绩只能在 0 – 100分之间的约束.
3加自定义约束:表 SC的成绩只能在 0 – 100分之间。
五 使用
select * from student 查看信息 select * from course 查看信息 select * from sc 查看信息
试验四 数据完整性试验
6
SQL-Server实验讲义
目的:1理解实体完整性、参照完整性、用户自定义完整性的作用
2 特别掌握外码的作用。
要求:记录试验中遇到的问题,并写出原因。
实验前需要利用试验三完成的脚本文件 createSchool.sql,重新建立数据库 school 。
一 实体完整性
1 student 表数据输入 学号 姓名 性别 年龄 3001 20 赵达 男 3002 21 杨丽 女 3001 21 李寅 女 ? 输入上述数据,记录出现的问题,说明原因。 第三行不能输入。
Student 的主码为 sno , 因此 sno 列的值不能重复。 ? select * from student 查看你输入了几行数据。
2 course 表数据的输入 Cno Cname Cpno 1081 4 电子商务
3 SC 表数据的输入
Sno Cno Grade 3001 1081 90 3001 1081 79 输入上述数据,记录出现的问题,说明原因。
系科 SX JSJ SX Ccredit 二 用户自定义完整性约束
表student 有用户自定义约束:
性别 不能为空且取值范围为{男,女} 年龄大于16岁 表course 的自定义约束:
Ccredit 取值范围{ 0 ,1,2,3,4,5 }
课程表的每一行的 Cno 与 cpno 不可相同
1 student 表数据输入 学号 姓名 性别 年龄 3005 14 赵达 男 3006 21 杨丽 南 ? 输入上述数据,记录出现的问题,说明原因。
3005 学生不能输入,年龄问题,有约束 sage>16 3006学生不能输入,性别不对。
系科 SX JSJ 7
SQL-Server实验讲义
? select * from student 查看你输入了那些数据。
2 course 表数据的输入 Cno Cname Cpno Ccredit 1085 C++ 9 1086 语文 1086 3 ? 输入上述数据,记录出现的问题,说明原因。 1086 不能输入,因为有约束 check(cno<>cpno) ? select * from student 查看你输入了那些数据。
3 SC 表数据的输入 Sno Cno Grade 3002 1081 128
? 输入上述数据,记录出现的问题,说明原因。
3002 这条数据不能输入,因为 grade不能大于 100分 ? select * from student 查看你输入了那些数据。
8
SQL-Server实验讲义
三 参照完整性约束
? 掌握表之间建立外码后,对被参照表的如下操作会有何影响:
修改主码、插入新行、删除新行?
? 对参照表添加新行、删除行、修改外码值有何影响? ? 掌握级联修改、级联删除的概念。
注意:
表SC的 Sno是外码,参照student的sno。 表SC的 Cno是外码,参照course的cno。
1 输入实验前的数据
学生表 Student Sno Sname 4001 赵尹 4002 杨开 课程表 course Cno Cname 1088 Java 1089 数学
学生选课 SC Sno Cno 4001 1088 4002 1088 Ssex 男 女 Sage 20 20 Sdept SX JSJ Cpno Ccredit 5 3 Grade 90 86 2 试验过程
1) 在SC表中添加新行: Sno Cno Grade 4001 1066 76 记录试验结果.,写出出现此结果的原因.
不能添加,因为在 cno是外码,参照course的 cno , 但在course 中没有 1066课程。
2) 在student表中添加新行 Sno Sname Ssex Sage Sdept 4003 21 SX 赵辉 男 记录试验结果.,写出出现此结果的原因. 可以输入
3) 删除student 表的 4001 ,4002学生 记录试验结果.,写出出现此结果的原因.
两个学生不能被删除,因为sc的外码 sno 参照student的sno, sc中已经有4001,4002学生的数据,因此不能删除。 思考:
? 删除SC表的记录有限制吗?
没有
9
SQL-Server实验讲义
? 采取什么技术能使不能成功执行的命令变得可以执行,且使数据库保持数据完整
性。 级联删除
4) 把 student 表的学号 4003 改为 4018 , 4001改为4021。 记录试验结果.,写出出现此结果的原因. 4003 可以改为 4018, 4001不能改为 4021
因为sc的外码 sno 参照student的sno, sc中已经有4001的数据,但没有 4003的选课数据。
思考:采取什么技术能使本题不能执行的命令可以执行,且使数据库保持数据完整性。 级联修改
5) 把sc表中的如下记录的学号从4001改为4011。 Sno Cno Grade 4001 1088 90 记录试验结果.,写出出现此结果的原因.
不能修改,因为sc的外码 sno 参照student的sno, 4011在 student中不存在。
如不成功,则可以采取什么方法来实现此要求。 需要在student表中添加 4011学生。
? 如不成功,那么把4001修改为4003,能成功吗?
能成功!
思考: 参照完整性规则中,外码可以为空, 但SC表中的外码可以为空吗?为什么?
举一个外码可以为空的例子。
不可以,因为 sc表的主码为 sno+cno, 即sno,cno为主属性,所以不能为空。
试验五 索引
目的:掌握索引的建立、删除的方法。
一 创建索引
1 建 student 的索引
为姓名建立索引,索引名:Ix_student_sname 为系科建立索引,索引名:Ix_student_sdept create index ix_student_sname ON student(sname) create index ix_student_sdept ON student(sdept)
2 SC 的索引
为课程号建立索引: ix_sc_cno create index ix_sc_cno ON sc(cno)
3 Course 的索引
为课程名建立唯一性索引 :Ix_course_cname
create unique index ix_course_cname ON course( cname)
4 如何 SP_HELP 查看索引刚才建立的索引? 如何在企业管理器中查看索引?
二 删除索引 course 表的索引 IX_course_cname
DROP INDEX course.ix_course_cname
10