数据库系统原理实验报告4 | 数据完整性

2024-04-25 01:04

本文主要是介绍数据库系统原理实验报告4 | 数据完整性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

整理自博主本科《数据库系统原理》专业课自己完成的实验报告,以便各位学习数据库系统概论的小伙伴们参考、学习。

专业课本:

————

本次实验使用到的图形化工具:Heidisql

目录

一、实验目的

二、实验内容

1、建表

   2、对1题中创建的Student表,增加以下约束:

1)姓名不能为空

2)性别默认为‘男’

3)性别取值只能为‘男’、‘女’

4)学生年龄大于10、小于40

5)学生表中的所在院系sdname参照department表的dname,删除规则是级联,更新规则是拒绝;学生表中的专业spec参照speciality表的specno,删除规则是设置为空,更新规则是级联。

 3、完整性检验

1)实体完整性

2)用户定义完整性检验

3)参照完整性检验

4、完整SQL代码

三、实验结果总结

四、实验结果的运用


一、实验目的

1、熟练使用SQL语句创建表和修改表,巩固数据定义语句。

2、通过SQL语句验证数据库的三类完整性约束,尤其是参照完整性,加深对于完整性的理解。

3、初步掌握数据更新语句:插入,删除和更新记录。


二、实验内容

创建一个名为TEST数据库,要求如下:

(下面三个表中属性的数据类型需要自己设计合适的数据类型

1、建表

  • 建立专业表speciality,它由专业号specno、专业名specname组成,其中专业号为主键,采用 列级定义主键,专业名不能为空。
  • 建立院系表department,它由院名dname、院长dean、院职工人数dnum组成。其中院名为主属性,采用表级定义主键。
  • 建立一个“学生”表Student,它由学号sno、姓名sname、性别ssex、年龄sage、所在院系sdname、专业spec六个属性组成。采用表级定义主键。

代码:

#建立专业表speciality,它由专业号specno、专业名specname组成,其中专业号为主键,采用列级定义主键,专业名不能为空。
CREATE TABLE speciality(specno INT PRIMARY KEY,specname CHAR(20) NOT NULL
);#建立院系表department,它由院名dname、院长dean、院职工人数dnum组成。其中院名为主属性,采用表级定义主键。
CREATE TABLE department(dname CHAR(20) , dean CHAR(10) ,dnum INT ,PRIMARY KEY (dname)
);#建立一个“学生”表Student,它由学号sno、姓名sname、性别ssex、年龄sage、所在院系sdname、专业spec六个属性组成。采用表级定义主键。
CREATE TABLE student(sno CHAR(9),sname CHAR(20),ssex CHAR(2),sage SMALLINT, sdname CHAR(20),spec INT,PRIMARY KEY (sno)
)

   2、对1题中创建的Student表,增加以下约束:

1)姓名不能为空

代码:

#姓名不能为空
ALTER TABLE studentMODIFY COLUMN sname CHAR(20) NOT NULL;

2)性别默认为‘男’

代码:

#性别默认为‘男’
ALTER TABLE studentMODIFY COLUMN ssex CHAR(2) DEFAULT '男';

3)性别取值只能为‘男’、‘女’

 

代码:

#性别取值只能为‘男’、‘女’
ALTER TABLE studentADD CONSTRAINT CHECK (ssex='男'OR ssex='女');

4)学生年龄大于10、小于40

代码:

#学生年龄大于10、小于40
ALTER TABLE studentADD CONSTRAINT CHECK (sage>10 AND sage<40);

5)学生表中的所在院系sdname参照department表的dname,删除规则是级联,更新规则是拒绝;学生表中的专业spec参照speciality表的specno,删除规则是设置为空,更新规则是级联。

代码:

ALTER TABLE studentADD FOREIGN KEY (sdname) REFERENCES department(dname) ON DELETE CASCADE ON UPDATE NO ACTION ;

代码:

ALTER TABLE studentADD FOREIGN KEY (spec) REFERENCES speciality(specno) ON DELETE SET NULL ON UPDATE CASCADE ; 

 3、完整性检验

1)实体完整性

(1)用SQL语句,在学生表中插入一条学号为空的记录和重复学号的记录,观察运行的情况。说明为什么。

代码:

#实体完整性检验
INSERT INTO student (sno) VALUES (NULL);#用SQL语句,在学生表中插入一条学号为空的记录
INSERT INTO student (sno) VALUES (493);
INSERT INTO student (sno) VALUES (493);#插入重复学号的记录

说明:关系模型的实体完整性用primary key定义,主码任一主属性不可为空且主码值必须唯一。定义了关系主码后,每当用户程序对基本表插入一条记录或对主码进行更新操作时,关系数据库按照实体完整性规则进行检查。若主码值不唯一,则拒绝插入或修改;若有一个主属性为空,则拒绝插入或修改。

2)用户定义完整性检验

(1)用SQL语句,在每个表中分别插入两条合法记录。

代码:

#用户定义完整性检验
#用SQL语句,先在每个表中分别插入两条合法记录。
INSERT INTO speciality VALUES (1001,'软件工程');
INSERT INTO speciality VALUES (1002,'汉语言文学');
#在专业表中插入两条记录  #department,它由院名dname、院长dean、院职工人数dnum组成。其中院名为主属性,采用表级定义主键。
INSERT INTO department VALUES ('软件学院','张三',50);
INSERT INTO department VALUES ('文学院','李四',25);
#在院系表中插入两条记录#Student,它由学号sno、姓名sname、性别ssex、年龄sage、所在院系sdname、专业spec六个属性组成。采用表级定义主键
INSERT INTO student VALUES (30001,'喜羊羊',DEFAULT,15,'软件学院',1001);
INSERT INTO student VALUES (30002,'魔法少女小樱','女',17,'文学院',1002);

(2)用SQL语句,非法的记录来检验第4题中的用户定义完整性约束条件。

代码:

#插入非法的记录来检验第4题中的用户定义完整性约束条件。
INSERT INTO speciality(specname) VALUES (NULL);#令专业表专业名为空
INSERT INTO student(ssex) VALUES ('未知');#令学生表性别为除“男”与“女”之外的“未知”
INSERT INTO student(sage) VALUES (100);#令学生表年龄为100,不在预设范围内		   

3)参照完整性检验

(1)用SQL语句,插入:分别在三个表中插入若干条记录。在学生表中插入记录时,注意sdname要参照院系表,spec要参照专业表。

代码:

#参照完整性检验
#分别在三个表中插入若干条记录。在学生表中插入记录时,注意sdname要参照院系表,spec要参照专业表。
#学生表中的所在院系sdname参照department表的dname,删除规则是级联,更新规则是拒绝;
#学生表中的专业spec参照speciality表的specno,删除规则是设置为空,更新规则是级联.
INSERT INTO student(sdname,spec) VALUES ('外语学院',6666);#在参照表学生表中插入的元组的sdname,spec在被参照表中不存在

(2)用SQL语句,删除和修改:删除专业表中的,被学生表参照的一个专业记录,观察学生表中发生了什么变化,为什么?

代码:

#用SQL语句,删除和修改:删除专业表中的,被学生表参照的一个专业记录,观察学生表中发生了什么变化,为什么?
DELETE FROM speciality WHERE specno=1001;

说明:

学生表中所有包含专业号“1001”的元组都被删除。

在参照完整性中定义了级联删除。学生表是参照表,专业表是被参照表。当删除被参照表的一个元组导致与参照表不一致时,删除参照表中所有导致不一致的元组。

(3)修改专业表中的,被学生表参照的一个专业号,观察学生表中发生了什么变化,为什么?

代码:

#修改专业表中的,被学生表参照的一个专业号,观察学生表中发生了什么变化,为什么?
UPDATE speciality SET specno=9999 WHERE specno=1001;

说明:

学生表中所有包含专业号“1001”的元组都被修改为“9999”。

在参照完整性中定义了级联修改。学生表是参照表,专业表是被参照表。当修改被参照表的一个元组导致与参照表不一致时,修改参照表中所有导致不一致的元组。

(4)用SQL语句,删除和修改:删除院系表中的,被学生表参照的一条记录,观察学生表中发生了什么变化,为什么?

代码:

#删除院系表中的,被学生表参照的一条记录,观察学生表中发生了什么变化,为什么?
DELETE FROM department WHERE dname='软件学院'; 

说明:

院系表中所有包含院系名“软件学院”的元组都被删除。

在参照完整性中定义了级联删除。学生表是参照表,专院系表是被参照表。当删除被参照表的一个元组导致与参照表不一致时,删除参照表中所有导致不一致的元组。

(5)修改院系表中的,被学生表参照的一条记录的院系名,观察学生表中发生了什么变化,为什么?

代码:

#修改院系表中的,被学生表参照的一条记录的院系名,观察学生表中发生了什么变化,为什么?
UPDATE department SET dname='历史学院' WHERE dname='文学院';

说明:定义了拒绝执行。当修改导致参照表与被参照表不一致时,不允许该操作的执行。 

4、完整SQL代码

CREATE DATABASE test;
USE test;
SELECT DATABASE();  #建立专业表speciality,它由专业号specno、专业名specname组成,其中专业号为主键,采用列级定义主键,专业名不能为空。
CREATE TABLE speciality(specno INT PRIMARY KEY,specname CHAR(20) NOT NULL
);#建立院系表department,它由院名dname、院长dean、院职工人数dnum组成。其中院名为主属性,采用表级定义主键。
CREATE TABLE department(dname CHAR(20) , dean CHAR(10) ,dnum INT ,PRIMARY KEY (dname)
);#建立一个“学生”表Student,它由学号sno、姓名sname、性别ssex、年龄sage、所在院系sdname、专业spec六个属性组成。采用表级定义主键。
CREATE TABLE student(sno CHAR(9),sname CHAR(20),ssex CHAR(2),sage SMALLINT, sdname CHAR(20),spec INT,PRIMARY KEY (sno)
)#对3题中创建的Student表,增加以下约束:
#姓名不能为空
ALTER TABLE studentMODIFY COLUMN sname CHAR(20) NOT NULL;
#性别默认为‘男’
ALTER TABLE studentMODIFY COLUMN ssex CHAR(2) DEFAULT '男';
#性别取值只能为‘男’、‘女’
ALTER TABLE studentADD CONSTRAINT CHECK (ssex='男'OR ssex='女');
#学生年龄大于10、小于40
ALTER TABLE studentADD CONSTRAINT CHECK (sage>10 AND sage<40);
#学生表中的所在院系sdname参照department表的dname,删除规则是级联,更新规则是拒绝;
#学生表中的专业spec参照speciality表的specno,删除规则是设置为空,更新规则是级联.
ALTER TABLE studentADD FOREIGN KEY (sdname) REFERENCES department(dname) ON DELETE CASCADE ON UPDATE NO ACTION ;
ALTER TABLE studentADD FOREIGN KEY (spec) REFERENCES speciality(specno) ON DELETE SET NULL ON UPDATE CASCADE ; ALTER TABLE studentMODIFY COLUMN sname CHAR(20) NOT NULL ;#实体完整性检验
INSERT INTO student (sno) VALUES (NULL);#用SQL语句,在学生表中插入一条学号为空的记录
INSERT INTO student (sno) VALUES (493);
INSERT INTO student (sno) VALUES (493);#插入重复学号的记录#学号sno、姓名sname、性别ssex、年龄sage、所在院系sdname、专业spec#用户定义完整性检验
#用SQL语句,先在每个表中分别插入两条合法记录。
INSERT INTO speciality VALUES (1001,'软件工程');
INSERT INTO speciality VALUES (1002,'汉语言文学');
#在专业表中插入两条记录  #department,它由院名dname、院长dean、院职工人数dnum组成。其中院名为主属性,采用表级定义主键。
INSERT INTO department VALUES ('软件学院','张三',50);
INSERT INTO department VALUES ('文学院','李四',25);
#在院系表中插入两条记录#Student,它由学号sno、姓名sname、性别ssex、年龄sage、所在院系sdname、专业spec六个属性组成。采用表级定义主键
INSERT INTO student VALUES (30001,'喜羊羊',DEFAULT,15,'软件学院',1001);
INSERT INTO student VALUES (30002,'魔法少女小樱','女',17,'文学院',1002);#插入非法的记录来检验第4题中的用户定义完整性约束条件。
INSERT INTO speciality(specname) VALUES (NULL);#令专业表专业名为空
INSERT INTO student(ssex) VALUES ('未知');#令学生表性别为除“男”与“女”之外的“未知”
INSERT INTO student(sage) VALUES (100);#令学生表年龄为100,不在预设范围内		   #参照完整性检验
#分别在三个表中插入若干条记录。在学生表中插入记录时,注意sdname要参照院系表,spec要参照专业表。
#学生表中的所在院系sdname参照department表的dname,删除规则是级联,更新规则是拒绝;
#学生表中的专业spec参照speciality表的specno,删除规则是设置为空,更新规则是级联.
INSERT INTO student(sdname,spec) VALUES ('外语学院',6666);#在参照表学生表中插入的元组的sdname,spec在被参照表中不存在#用SQL语句,删除和修改:删除专业表中的,被学生表参照的一个专业记录,观察学生表中发生了什么变化,为什么?
DELETE FROM speciality WHERE specno=1001;
#修改专业表中的,被学生表参照的一个专业号,观察学生表中发生了什么变化,为什么?
UPDATE speciality SET specno=9999 WHERE specno=1001;#删除院系表中的,被学生表参照的一条记录,观察学生表中发生了什么变化,为什么?
DELETE FROM department WHERE dname='软件学院'; #修改院系表中的,被学生表参照的一条记录的院系名,观察学生表中发生了什么变化,为什么?
UPDATE department SET dname='历史学院' WHERE dname='文学院';

三、实验结果总结

  1. 本次实验过程中,我除了语法错误(如在创建表的倒数第二行加了逗号,把primary key写为primary)外,没有其它的错误。
  2. 巩固了数据定义语句,上机操作实验代码,加深对语句的熟悉,记得更牢了。基本能够熟练使用SQL语句进行create创建表和alter修改表。
  3. 通过SQL语句验证了数据库的三类完整性约束。结合前两个礼拜的理论部分和这礼拜学的SQL语言实践部分,对于完整性的理解更加深入。搞懂了参照完整性的概念和机制。
  4. 学会掌握数据更新语句插入,删除和更新记录,以及参照完整性中外键的更新规则级联、删除和设为空值的运用。

四、实验结果的运用

使用实验三中的Student、Course、SC表。

基本建表代码:

CREATE DATABASE educ;
USE educ;
SELECT DATABASE();CREATE TABLE Student(Sno CHAR(9) PRIMARY KEY ,Sname CHAR(20) UNIQUE ,Ssex CHAR(2) DEFAULT'男',Sage SMALLINT,Sdept CHAR(20) 
);CREATE TABLE Course(Cno CHAR(4) NOT NULL PRIMARY KEY ,Cname CHAR(40) NOT NULL ,Cpno CHAR(4) ,Ccredit SMALLINT ,FOREIGN KEY (Cpno) REFERENCES Course(Cno)
);CREATE TABLE SC(Sno CHAR(9) ,Cno CHAR(4) ,Grade SMALLINT ,PRIMARY(Sno,Cno),FOREIGN KEY (Sno) REFERENCES Student(Sno),FOREIGN KEY (Cno) REFERENCES Course(Cno)
);

实验结果的运用: 

这篇关于数据库系统原理实验报告4 | 数据完整性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/933326

相关文章

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

Dubbo之SPI机制的实现原理和优势分析

《Dubbo之SPI机制的实现原理和优势分析》:本文主要介绍Dubbo之SPI机制的实现原理和优势,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Dubbo中SPI机制的实现原理和优势JDK 中的 SPI 机制解析Dubbo 中的 SPI 机制解析总结Dubbo中

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

Redis实现分布式锁全解析之从原理到实践过程

《Redis实现分布式锁全解析之从原理到实践过程》:本文主要介绍Redis实现分布式锁全解析之从原理到实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、背景介绍二、解决方案(一)使用 SETNX 命令(二)设置锁的过期时间(三)解决锁的误删问题(四)Re

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持