任务描述
本关任务:定义选修课表的参照完整性。
相关知识
为了完成本关任务,你需要掌握:1.参照完整性,2,定义参照完整性,3.参照完整性检查和违约处理。
参照完整性
参照完整性就是相关联的两个表之间的约束。具体的说就是从表中每条记录外键的值必须是主表中存在的,因此如果在两个表之间建立了关联关系,则对一个关系进行的操作要影响到另一个表中的记录。
例如,如果在学生表和选修课之间用学号建立关联,学生表是主表,选修课是从表,那么在向从表中输入一条新记录时,系统要检查新记录的学号是否在主表中已存在,如果存在,则允许执行输入操作;否则拒绝输入,这就是参照完整性。
参照完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。参照完整性又称引用完整性。参照完整性还体现在对主表中的删除和更新操作。
例如,如果删除主表中的一条记录,则从表中凡是外键的值与主表的主键值相同的记录也会被同时删除,将此称为级联删除;如果修改主表中主关键字的值,则从表中相应记录的外键值也随之被修改,将此称为级联更新。
定义参照完整性
关系模型的参照完整性在 CREATE TABLE 中用 FOREIGN KEY 短语定义哪些列为外码,用 REFERENCES 短语指明这些外码参照哪些表的主码。
例如关系 SC 中一个元组表示一个学生选修的某门课程的成绩。Sno、Cno 分别参照引用 Student 表的主码和 Course 表的主码:
CREATE TABLE SC(
Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno,Cno), /* 在表级定义实体完整性*/
FOREIGN KEY(Sno) REFERENCES Student(Sno), /*在表级定义参照完整性*/
FOREIGN KEY(Cno) REFERENCES Course(Cno) /*在表级定义参照完整性*/
);
参照完整性检查和违约处理
参照完整性将两个表中的相应元组联系起来了,因此对被参照表和参照表进行增、删、改操作时有可能破坏参照完整性,必须进行检查以保证这两个表的相容性。
那么当某个主码值被删除/更新时(这个主码值在被参照关系中)如何处理对应的外部码值(这些外部码值在参照关系中):
-
NO ACTION 方式:不允许执行该操作,该策略一般设置为默认策略。
-
RESTRICT 方式:仅当没有任何对应的外码值时,才可以删除/更新这个主码值,否则系统拒绝执行此操作。
-
CASCADE 方式:连带将所有对应的外码值一块删除/更新。(删除外码值,实际上就是将所在的元组删除掉)
-
SET NULL 方式:将所有对应的外码值设为空值。
可以显式的设置违约处理,即当违反某个约束条件时,执行用户设置的违约处理方式,语句为:ON 操作 违约处理方法
例如:
CREATE TABLE SC(
Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno,Cno),
FOREIGN KEY(Sno) REFERENCES Student(Sno)
ON DELETE CASCADE, /*当删除Student表中的Sno时,级联删除SC表中相应的元组*/
FOREIGN KEY(Cno) REFERENCES Course(Cno)
ON UPDATE CASCADE /*当更新Course表中的Cno时,级联更新SC表中相应的元组*/
);
编程要求
在右侧编辑器补充代码,在右侧编辑器Begin-End
处补充代码,定义选修课表(course)的参照完整性,要求修改学生表(student主表)中学生学号时从表选秀表中学号信息相应修改,下面为学生表和选修表结构及信息:
学生表(student)结构:
字段名称 | 类型 | 备注 | 约束 |
---|---|---|---|
sno | varchar(20) | 学号 | 主码 |
sname | varchar(20) | 姓名 | 无 |
ssex | char(2) | 性别 | 无 |
cno | varchar(20) | 课程代码 | 无 |
grade | int | 成绩 | 无 |
学生表信息:
sno | sname | ssex | cno | grade |
---|---|---|---|---|
202001 | Jack | 男 | SQL101 | 66 |
202002 | Tom | 男 | C++102 | 79 |
选修课表(course)结构:
字段名称 | 类型 | 备注 | 约束 |
---|---|---|---|
cno | varchar(20) | 课程代码 | 主码 |
cname | varchar(20) | 课程名称 | 无 |
cteacher | varchar(20) | 任课老师 | 无 |
csite | varchar(20) | 上课地点 | 无 |
sno | varchar(20) | 选课学生学号 | 外码 |
选修课表信息:
cno | cname | cteacher | csite | sno |
---|---|---|---|---|
SQL101 | 数据库系统概论 | 刘春喜 | 实验室2109 | 202001 |
C++102 | C++面向对象 | 张爱国 | 实验室3305 | 202002 |
测试说明
平台会对你编写的代码进行测试:
预期输出:
sno sname ssex cno grade
202001 Jack 男 SQL101 66
202003 Tom 男 C++102 79
cno cname cteacher csite sno
C++102 C++面向对象 张爱国 实验室3305 202003
SQL101 数据库系统概论 刘
########## 定义教师表的完整性 ########## #请在此处添加实现代码 ########## Begin ########## create table teacher( Tno char(5), Tname char(8) unique, Tsex char(1), Tage int, Tdept char(20) ); select * from teacher; ########## End ##########
春喜 实验室2109 202001