数据库系统原理实验报告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 student
		MODIFY COLUMN sname CHAR(20) NOT NULL;

2)性别默认为‘男’

代码:

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

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

 

代码:

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

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

代码:

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

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

代码:

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

代码:

ALTER TABLE student
		ADD 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 student
		MODIFY COLUMN sname CHAR(20) NOT NULL;
#性别默认为‘男’
ALTER TABLE student
		MODIFY COLUMN ssex CHAR(2) DEFAULT '男';
#性别取值只能为‘男’、‘女’
ALTER TABLE student
		ADD CONSTRAINT CHECK (ssex='男'OR ssex='女');
#学生年龄大于10、小于40
ALTER TABLE student
		ADD CONSTRAINT CHECK (sage>10 AND sage<40);
#学生表中的所在院系sdname参照department表的dname,删除规则是级联,更新规则是拒绝;
#学生表中的专业spec参照speciality表的specno,删除规则是设置为空,更新规则是级联.
ALTER TABLE student
		ADD FOREIGN KEY (sdname) REFERENCES department(dname) ON DELETE CASCADE ON UPDATE NO ACTION ;
ALTER TABLE student
		ADD FOREIGN KEY (spec) REFERENCES speciality(specno) ON DELETE SET NULL ON UPDATE CASCADE ; 

ALTER TABLE student
		MODIFY 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)
);

实验结果的运用: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/573338.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL--mysql的安装(压缩包安装保姆级教程)

官网下载&#xff1a;www.mysql.com MySQL :: Download MySQL Community Server (Archived Versions) 1.MySQL下载流程&#xff1a; 第一步&#xff1a;点击download&#xff0c; 下滑找到MySQL community&#xff08;gpl&#xff09;Downloads>> 第二步&#xff1a;点…

问题-MySQL将较大的SQL文件导入MySQL

迁移数据的时候&#xff0c;我们有时候会用sqlyog等数据库工具导入到新数据库。可能插入的SQL语句太大&#xff0c;出现导入一半失败的情况。明明代码没错&#xff0c;这让人摸不着头脑。 对于大文件导入&#xff0c;有几种方法&#xff1a; 方法1&#xff1a;使用命令行&…

这几种MBTI,活该做项目经理!

最近公司群里发了一个性格测试&#xff08;MBTI&#xff09;&#xff0c;让根据大家测出来的性格&#xff0c;适当挖掘一下自身潜力。 当对照性格解析时&#xff0c;才发现公司里真是卧虎藏龙&#xff0c;而且每个人测出来的性格和平时表现出的自己都非常贴合。 MBTI性格测试…

2024年Q1企业邮箱安全性研究报告:钓鱼邮件同比增长59.9%

4月23日&#xff0c;Coremail邮件安全联合北京中睿天下信息技术有限公司发布《2024年第一季度企业邮箱安全性研究报告》。对当前企业邮箱的应用状况和安全风险进行了分析。 1、垃圾邮件持续增长 根据Coremail邮件安全人工智能实验室最新数据显示&#xff0c;2024年第一季度&am…

Postman - 设置变量

场景&#xff1a; 比如你接口都有权限&#xff0c;访问需要每调一个接口都手动放token的值&#xff0c;这个时候就可以搞个全局的变量&#xff0c;只设置一次就可以了 1、设置变量 Environments -> Globals - > 设置key 、value 2、使用变量 {{你得变量名-key}} 3…

电动车DC-DC80V降33V/12V 3A大功率同步降压芯片_AH1008

AH1008是一款专为电动车设计的同步降压芯片&#xff0c;TEL&#xff1a;186*4884*3702*能够将输入电压从80V稳定地降至33V或12V&#xff0c;并提供最大3A的输出电流。该芯片采用了先进的同步降压转换技术&#xff0c;有效降低了能量损耗&#xff0c;提升了转换效率&#xff0c;…

做抖音小店,“自然流量”和“达人带货”,选择哪个更香?

大家好&#xff0c;我是电商笨笨熊 做抖音小店&#xff0c;关于选择自然流还是达人带货&#xff0c;从推出时就一直争吵到现在&#xff1b; 有人觉得自然流不需要佣金&#xff0c;一次性带来的爆单量很大&#xff1b; 有人觉得达人带货细水长流&#xff0c;虽然需要佣金&…

【大语言模型LLM】-基础语言模型和指令微调的语言模型

&#x1f525;博客主页&#xff1a;西瓜WiFi &#x1f3a5;系列专栏&#xff1a;《大语言模型》 很多非常有趣的模型&#xff0c;值得收藏&#xff0c;满足大家的收集癖&#xff01; 如果觉得有用&#xff0c;请三连&#x1f44d;⭐❤️&#xff0c;谢谢&#xff01; 长期不…

干货教程【AI篇】| 真人照片转动漫AI工具分享

今天给大家分享一个真人照片转动漫的工具。用真是拍摄的照片生成动漫/漫画/手绘/卡通图的工具。 需要这个工具的同学可以关注【文章底部公众号】&#xff0c;回复关键词【zpdm】即可获取本文所讲工具。 首先我们将下载下来的压缩包解压 直接双击红框内的文件就可以运行了。启…

ThinkPad E14 Gen 4,R14 Gen 4,E15 Gen 4(21E3,21E4,21E5,21E6,21E7)原厂Win11系统恢复镜像下载

lenovo联想ThinkPad笔记本电脑原装出厂Windows11系统安装包&#xff0c;恢复出厂开箱状态一模一样 适用型号&#xff1a;ThinkPad E14 Gen 4,ThinkPad R14 Gen 4,ThinkPad E15 Gen 4 (21E3,21E4,21E5,21E6,21E7) 链接&#xff1a;https://pan.baidu.com/s/1QRHlg2yT_RFQ81Tg…

解决在 Python 数据分析中遇到的 Matplotlib 字体警告问题

当在 Python 数据分析中遇到类似以下警告时&#xff1a; D:\anaconda3\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 24037 missing from current font.font.set_text(s, 0.0, flagsflags) D:\anaconda3\lib\site-packages\matplotlib\ba…

【前端】3. CSS【万字长文】

CSS 是什么 层叠样式表 (Cascading Style Sheets). CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结构分离. CSS 就是 “东方四大邪术” 之化妆术. 基本语法规范 选择器 {一条/N条声明} 选择器决定针对谁修改 (找谁)声明决…

XOCIETY在Sui构建玩家的天堂

Sui惊人的速度和创新的NFT技术使其成为游戏的绝佳环境&#xff0c;而没有什么比XOCIETY更能证明这一点了。XOCIETY是一款新的流行射击游戏&#xff0c;具有RPG元素&#xff0c;将于今年晚些时候登陆Sui网络。这款由NDUS Interactive制作的游戏在基于虚幻引擎5构建的丰富环境中提…

C. Left and Right Houses

本题链接&#xff1a;Problem - C - Codeforces 题目&#xff1a; 样例&#xff1a; 输入 7 3 101 6 010111 6 011001 3 000 3 110 3 001 4 1100输出 2 3 2 3 0 1 0 思路&#xff1a; 根据题目意思。 寻找一条道路进行分割该字符串&#xff0c;设该道路分割位置为 i &#x…

CSS border边框(理解网页边框制作)

目录 一、border边框介绍 1.概念 2.特点 3.功能 4.应用 二、border边框用法 1.border边框属性 2.边框样式 3.边框宽度 4.边框颜色 5.边框-单独设置各边 6.边框-简写属性 三、border边框属性 四、border边框实例 1.创建带有阴影效果的边框&#xff1a; 2. 创建一个类似标…

安全测试工具箱

工具列表 WebShell管理工具 哥斯拉v4.0.1 冰蝎v3.0Beta_11 冰蝎v4.1 冰蝎魔改v3.3.2 中国蚁剑v2.1.15 天蝎权限管理工具v1.0 Alien权限管理工具v4.0 渗透利器工具 BurpSuite Pro 2023.5.1 DudeSuite Cobalt Strike 4.7美化破解版 XieBro-v3.1 Counter-Strike1.6 YAKIT XRAY…

3d软件哪个适合新手学?3D动画渲染怎么好

在不同的行业领域&#xff0c;3D建模和动画的需求各异&#xff0c;因此所需的3D软件工具也会有所不同。对于刚开始接触3D设计的新手来说&#xff0c;软件的易操作性、丰富的学习资源以及与自己专业领域相关的功能是选择时的重要考虑因素。以下是几款适合初学者入门的3D软件推荐…

【Linux】gdb的简单使用

文章目录 一、gdb是什么&#xff1f;二、使用说明1. 安装2. 注意事项3. 常用调试指令3.1 gdb3.2 l3.3 r3.4 n3.5 s3.6 b3.7 info b3.8 finish3.9 p3.10 set var3.11 c3.12 d breakpoints3.13 d n3.14 disable/enable breakpoints3.15 disable/enable n3.16 info b3.17 display …

【UE C++】打印输出的两种方式

目录 一、UE_LOG 二、调试屏幕信息 一、UE_LOG 定义&#xff1a; UE_LOG 是一个将格式化消息记录到日志文件中的宏。 用法&#xff1a; UE_LOG(LogTemp, Warning, TEXT("Hello World")); 第一个输入参数 LogTemp 是提供给 DEFINE_LOG_CATEGORY 宏的类别名称。你…

饲料颗粒生产利器:全套饲料颗粒机设备揭秘

想要了解饲料颗粒机的全套设备吗&#xff1f;这里为您详细解析&#xff0c;让您对饲料颗粒机的全套配置一目了然&#xff01;饲料颗粒机全套设备&#xff0c;可谓是饲料生产的得力助手。从原料处理到颗粒成型&#xff0c;再到后续的包装存储&#xff0c;这套设备都能轻松应对。…