实验2.2 参照完整性
实验截图
实验代码
-8-
软件 C122 彭静 126226
实验截图 (4) 学校学生会的每个部门有一个部长,每个部长领导多个部员,每个部只有 一个部员有监察评测部长的权利。请给出体现这两种关系(即领导和评测)的 两张互参照的表的定义。 实验代码 实验截图 实验代码
实验截图
-9-
(9)演示事务中进行多重级联删除失败的处理。修改 ICBC_Card 表的外键属性, 使其变为 On delete No action,演示事务中通过删除 students 表中的一条记 录,多重级联删除失败,整个事务回滚到事务的初始状态。 实验代码
实验截图 实验代码
实验截图
(10)演示互参照问题以及其解决方法。要建立教师授课和课程指定教师停课关
软件 C122 彭静 126226
消息 547,级别 16,状态 0,第 7 行 INSERT 语句与 FOREIGN KEY 约束"FK__Stu_Card__stu_id__31B762FC"冲突。该冲突发生于数据库"school",表 "dbo.STUDENTS", column 'sid'。 语句已终止。 (1 行受影响) (1 行受影响)
实验截图
2.建立表 Course
-2-
实验截图
软件 C122 彭静 126226
(2)建立表 SC,令 sno 和 cno 分别为参照 Stu_Union 表以及 Course 表的外键, 设定为级联删除,并令(sno,cno)为其主键。在不违反参照完整性的前照完整性的插入数据。 实验代码
-6-
软件 C122 彭静 126226
系的两张表,规定一个教师可以授多门课,但是每个课程只能指定一个教师去 听课,所以要为两张表建立相互之间的参照关系。 实验代码
实验截图 实验代码
实验截图 实验代码
实验截图
-7-
软件 C122 彭静 126226
4.实验步骤: 实现参见数据库实验习题 2.2.sql 文 心得体会: 1、学习了参照完整性的相关内容,加深了对于这部分知识点的认识 5.习题 (1)使用 alter table 语句将 SC 表中的 on delete cascade 改为 on delete restrict,重新插入 SC 的数据,重复操作 实验步骤中的(4)和(5),观察结果, 分析原因。 数据库不允许删除 STUDENTS 表及 COURSE 表中对应元组 原因:由于 on delete restrict 的约束,数据库不允许引用任何关系存在对应 元组时进行删除操作 (2)使用 alter table 语句将 SC 表中的 on delete cascade 改为 on delete set NULL,重新插入 SC 的数据。 重复操作 2.2.3 实验步骤中的(4)和(5), 观察结果,分析原因。 数据库不允许删除 STUDENTS 表及 COURSE 表中对应元组 原因:约束 on delete set NULL 是将要删除的元组的外键置空值,如果 cno 及 sno 不是 SC 表的主键,删除操作可以完成,但由于主键不能取空值,所以删除 操作是不可以的 (3)创建一个班里的学生互助表,规定:包括学生编号、学生姓名、学生的帮助 对象,每个学生有且只有一个帮助对象,帮助对象也必须是班里的学生。 实验代码
(7)为了演示多重级联删除,建立 ICBC_Card 表,令 stu_card_id 为参照 Stu_Card 表的外键,令 bank_id 为其主键,并插入数据。 实验代码
实验截图
(8)通过删除 students 表中的一条记录,演示三个表的多重级联删除。 实验代码
实验截图
-5-
软件 C122 彭静 126226
-3-
软件 C122 彭静 126226
实验截图
(5)在 Course 中删除数据,演示级联删除。 实验代码
实验截图 (6)为了演示多重级联删除,建立 Stu_Union 表,令 stu_id 为参照 Stu_Union 表的外键,令 card_id 为其主键,并插入数据。 实验代码
实验截图
-4-
实验截图
消息 547,级别 16,状态 0,第 2 行 INSERT 语句与 FOREIGN KEY 约束"FK__SC__sno__2739D489"冲突。该冲突发生于数据库"school",表"dbo.Stu_Union", column 'sno'。 语句已终止。
(4)在 Stu_Union 中删除数据,演示级联删除。 实验代码
-1-
软件 C122 彭静 126226
(系统默认的方式 no action) 参照表 拒绝执行 不需要检查 拒绝执行 5)参照完整性的特殊问题 表的自参考问题。 问题 1:无法定义。 处理方法:先用 create table 创建主键约束,再用 alter table 创建外键约 束。 问题 2:容易造成无法启动的情况。(系统通过事务完毕后再检查) (2)两张表互相参照的问题。 问题 1:无法定义。 处理方法:同表的自参照问题的 方法相同。 问题 2:容易造成无法启动的情况。(系统通过事务完毕后再检查) (3) 既是外键又是主键中的属性。 处理方法:既要遵从实体完整性也要遵从参照完整性。 3.实验内容: (1)为演示参照完整性,建立表 Course,令 cno 为主键,并在 Stu_Union 中插入 数据。为下面的实验步骤做预先准备。 1.根据 2.1 建立 Stu_Union 表
软件 C122 彭静 126226
实验 2.2 参照完整性 软件 C122 彭静 126226 1.实验目的: 学习建立外键,以及利用 FOREIGN KEY---REFERENCES 子句以及各种约束保证 参照完整性。 2.实验原理: 1)参照完整性(Referential Integrity) 参照完整性是指两个表的主关键字和外关键字的数据对应一致。它确保了有主 关键字的表中对应其他表的外关键字的行存在,即保证了表之间的数据的一致 性,防止了数据丢失或无意义的数据在数据库中扩散,参照完整性是建立在外 关键字和主关键之间或外关键字和唯一性关键字之间的关系上的。 参照完整性规则:关系 R 的外来码取值必须是关系 S 中某个元组的主码值,或 者可以是一个“空值”。 定义外键时定义参照完整性、约束参照表 A 和被参照表 B。对于违反参照完整 性的操作有时候并不是简单拒绝执行,而是接受该操作,同时执行必要的附加 操作。DBMS 提供机制来定义是否必须制定外键的具体值而非空值。主键列和外 键列可以有不同的名字,空值的要求也可以不一致,默认值也可以不同,但数 据类型必须相同。 2)SQL Server 中完整性的体现 在 SQL Server 中参照完整性作用表现在如下几个方面: ·禁止在从表中插入包括主要中不存在的外关键字的数据行。 ·禁止会导致从表中的相应值孤立的主表中的外关键字值改变。、 ·禁止删除在从表中的有对应记录的主表记录。 3)SQL 语句中删除和插入基本关系元组 (1)在被参照关系中删除元组的三种控制方式: ·级联删除(CASCADES):将参照关系中与被参照关系中要删除的元组主键值相 同的元组一起删除。 ·受限删除(RESTRICTED):只有参照关系中没有元组与被参照关系中要删除的 元组主键值相同时才执行删除操作,否则拒绝。 ·置空值删除(SET NULL):删除被参照关系中的元组,同时将参照关系中相应 元组的外键值置空。 (2)在参照关系中插入元组。 ·受限插入:只是被参照关系中有元组与参照关系中要插入元组外键值相同时, 才执行插入操作,否则拒绝。 ·递归插入:插入元组外键值在被参照关系中没有相同元组,则首先向被参照 关系插入元组,其主键值等于参照关系插入元组的外键值,然后再向参照关系 插入元组。 4)DBMS 对参照完整性进行检查的四种情况 (1)在四种情况下 DBMS 要进行检查,分别是对参照表进行插入和修改以及对 被参照表进行删除和修改。 (2)SQL Server 四种情况违反参照完整性的处理方法如表所示: 相关操作 INSERT DELETE UPDATE 被参照表 不需要检查 ON DELETE…(用户显示定义的 方式,提供两种:cascade 和 no action)OR default(系统默认的方式 no action) ON UPDATE…(用户显示方式,提供两种:cascade 和 no action)OR default