第1关:参照完整性

本文介绍了数据库中的参照完整性概念,如何在SQL中使用FOREIGNKEY和REFERENCES定义关联关系,并详细讲解了级联删除和级联更新的处理方式。编程要求部分展示了如何在选修课表中实现参照完整性的级联更新功能,以确保数据一致性。
摘要由CSDN通过智能技术生成

任务描述

本关任务:定义选修课表的参照完整性。

相关知识

为了完成本关任务,你需要掌握:1.参照完整性,2,定义参照完整性,3.参照完整性检查和违约处理。

参照完整性

参照完整性就是相关联的两个表之间的约束。具体的说就是从表中每条记录外键的值必须是主表中存在的,因此如果在两个表之间建立了关联关系,则对一个关系进行的操作要影响到另一个表中的记录。

例如,如果在学生表和选修课之间用学号建立关联,学生表是主表,选修课是从表,那么在向从表中输入一条新记录时,系统要检查新记录的学号是否在主表中已存在,如果存在,则允许执行输入操作;否则拒绝输入,这就是参照完整性。

参照完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。参照完整性又称引用完整性。参照完整性还体现在对主表中的删除和更新操作。

例如,如果删除主表中的一条记录,则从表中凡是外键的值与主表的主键值相同的记录也会被同时删除,将此称为级联删除;如果修改主表中主关键字的值,则从表中相应记录的外键值也随之被修改,将此称为级联更新

定义参照完整性

关系模型的参照完整性在 CREATE TABLE 中用 FOREIGN KEY 短语定义哪些列为外码,用 REFERENCES 短语指明这些外码参照哪些表的主码。

例如关系 SC 中一个元组表示一个学生选修的某门课程的成绩。Sno、Cno 分别参照引用 Student 表的主码和 Course 表的主码:

 
  1. CREATE TABLE SC(
  2. Sno CHAR(9) NOT NULL,
  3. Cno CHAR(4) NOT NULL,
  4. Grade SMALLINT,
  5. PRIMARY KEY(Sno,Cno), /* 在表级定义实体完整性*/
  6. FOREIGN KEY(Sno) REFERENCES Student(Sno), /*在表级定义参照完整性*/
  7. FOREIGN KEY(Cno) REFERENCES Course(Cno) /*在表级定义参照完整性*/
  8. );
参照完整性检查和违约处理

参照完整性将两个表中的相应元组联系起来了,因此对被参照表和参照表进行增、删、改操作时有可能破坏参照完整性,必须进行检查以保证这两个表的相容性。

那么当某个主码值被删除/更新时(这个主码值在被参照关系中)如何处理对应的外部码值(这些外部码值在参照关系中):

  • NO ACTION 方式:不允许执行该操作,该策略一般设置为默认策略。

  • RESTRICT 方式:仅当没有任何对应的外码值时,才可以删除/更新这个主码值,否则系统拒绝执行此操作。

  • CASCADE 方式:连带将所有对应的外码值一块删除/更新。(删除外码值,实际上就是将所在的元组删除掉)

  • SET NULL 方式:将所有对应的外码值设为空值。

可以显式的设置违约处理,即当违反某个约束条件时,执行用户设置的违约处理方式,语句为:ON 操作 违约处理方法

例如:

 
  1. CREATE TABLE SC(
  2. Sno CHAR(9) NOT NULL,
  3. Cno CHAR(4) NOT NULL,
  4. Grade SMALLINT,
  5. PRIMARY KEY(Sno,Cno),
  6. FOREIGN KEY(Sno) REFERENCES Student(Sno)
  7. ON DELETE CASCADE, /*当删除Student表中的Sno时,级联删除SC表中相应的元组*/
  8. FOREIGN KEY(Cno) REFERENCES Course(Cno)
  9. ON UPDATE CASCADE /*当更新Course表中的Cno时,级联更新SC表中相应的元组*/
  10. );

编程要求

在右侧编辑器补充代码,在右侧编辑器Begin-End处补充代码,定义选修课表(course)的参照完整性,要求修改学生表(student主表)中学生学号时从表选秀表中学号信息相应修改,下面为学生表和选修表结构及信息:

学生表(student)结构:

字段名称类型备注约束
snovarchar(20)学号主码
snamevarchar(20)姓名
ssexchar(2)性别
cnovarchar(20)课程代码
gradeint成绩

学生表信息:

snosnamessexcnograde
202001JackSQL10166
202002TomC++10279

选修课表(course)结构:

字段名称类型备注约束
cnovarchar(20)课程代码主码
cnamevarchar(20)课程名称
cteachervarchar(20)任课老师
csitevarchar(20)上课地点
snovarchar(20)选课学生学号外码

选修课表信息:

cnocnamecteachercsitesno
SQL101数据库系统概论刘春喜实验室2109202001
C++102C++面向对象张爱国实验室3305202002

测试说明

平台会对你编写的代码进行测试:

预期输出:

 
  1. sno sname ssex cno grade
  2. 202001 Jack 男 SQL101 66
  3. 202003 Tom 男 C++102 79
  4. cno cname cteacher csite sno
  5. C++102 C++面向对象 张爱国 实验室3305 202003
  6. SQL101 数据库系统概论 刘春喜 实验室2109 202001

开始你的任务吧,祝你成功!

########## 定义选修课表的参照完整性 ##########
#请在此处添加实现代码
########## Begin ##########

create table course (
cno  	    varchar(20)	primary key,
cname	    varchar(20)	,
cteacher	varchar(20),	
csite	    varchar(20)	,
sno	        varchar(20),
foreign key(sno) references student(sno) 
 on update cascade
);


########## End ##########

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小珠佩奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值