数据库系统原理实验报告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六个属性组成。采用表级定义主键。

代码:

sql 复制代码
#建立专业表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)姓名不能为空

代码:

sql 复制代码
#姓名不能为空
ALTER TABLE student
		MODIFY COLUMN sname CHAR(20) NOT NULL;

2)性别默认为'男'

代码:

sql 复制代码
#性别默认为'男'
ALTER TABLE student
		MODIFY COLUMN ssex CHAR(2) DEFAULT '男';

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

代码:

sql 复制代码
#性别取值只能为'男'、'女'
ALTER TABLE student
		ADD CONSTRAINT CHECK (ssex='男'OR ssex='女');

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

代码:

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

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

代码:

sql 复制代码
ALTER TABLE student
		ADD FOREIGN KEY (sdname) REFERENCES department(dname) ON DELETE CASCADE ON UPDATE NO ACTION ;

代码:

sql 复制代码
ALTER TABLE student
		ADD FOREIGN KEY (spec) REFERENCES speciality(specno) ON DELETE SET NULL ON UPDATE CASCADE ; 

3、完整性检验

1)实体完整性

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

代码:

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 复制代码
#用户定义完整性检验
#用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题中的用户定义完整性约束条件。

代码:

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

3)参照完整性检验

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

代码:

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

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

代码:

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

说明:

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

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

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

代码:

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

说明:

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

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

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

代码:

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

说明:

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

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

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

代码:

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

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

4、完整SQL代码

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表。

基本建表代码:

sql 复制代码
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)
);

实验结果的运用:

相关推荐
心之所想,行之将至5 分钟前
零基础开始学习鸿蒙开发-交友软件页面设计
学习·交友
搬码后生仔10 分钟前
SQLite 是一个轻量级的嵌入式数据库,不需要安装服务器,直接使用文件即可。
数据库·sqlite
码农君莫笑12 分钟前
Blazor项目中使用EF读写 SQLite 数据库
linux·数据库·sqlite·c#·.netcore·人机交互·visual studio
江上挽风&sty13 分钟前
【Django篇】--动手实践Django基础知识
数据库·django·sqlite
向阳121817 分钟前
mybatis 动态 SQL
数据库·sql·mybatis
胡图蛋.19 分钟前
什么是事务
数据库
小黄人软件21 分钟前
20241220流水的日报 mysql的between可以用于字符串 sql 所有老日期的,保留最新日期
数据库·sql·mysql
张声录126 分钟前
【ETCD】【实操篇(三)】【ETCDCTL】如何向集群中写入数据
数据库·chrome·etcd
无为之士32 分钟前
Linux自动备份Mysql数据库
linux·数据库·mysql
小汤猿人类1 小时前
open Feign 连接池(性能提升)
数据库