数据库实验三:完整性语言实验

news2024/11/16 18:53:18

实验三 完整性语言实验

实验 3.1 实体完整性实验

1.实验目的

​ 掌握实体完整性的定义和维护方法。

2.实验内容和要求

​ 定义实体完整性,删除实体完整性。能够写出两种方式定义实体完整性的SQL语句;创建表时定义实体完整性、创建表后定义实体完整性。设计SQL语句验证完整性约束是否起作用。

3.实验重点和难点

​ 实验重点:创建表时定义实体完整性。
​ 实验难点:有多个候选码时实体完整性的定义。

4.实验过程

(1)创建表时定义完整性(列级实体完整性)

​ 定义学生表的实体完整性。

CREATE TABLE student(
	Sno CHAR(9) PRIMARY KEY,	/*MYSQL中实体完整性约束不可以命名*/
    Sname CHAR(20),
    Ssex CHAR(2),
    Ssage SMALLINT,
	Sdept CHAR(10)
);

(2)创建表时定义实体完整性(表级实体完整性)

​ 定义学生表的实体完整性。

CREATE TABLE student(
	Sno CHAR(9),	
    Sname CHAR(20),
    Ssex CHAR(2),
    Sage SMALLINT,
	Sdept CHAR(10),
    PRIMARY KEY(Sno)
);

(3)创建表后定义实体完整性

​ 定义课程表。

CREATE TABLE Course(	
	Cno CHAR(9),
	Cname CHAR(20),
    Cpno CHAR(9),
    Ctype CHAR(5),
    Cdept CHAR(20),
    Chours SMALLINT,
    Ccredit SMALLINT
);	
ALTER TABLE Course
ADD PRIMARY KEY(Cno);

(4)定义实体完整性(主码由多个属性组成)

​ 定义选课表的实体完整性。

CREATE TABLE SC(
	Sno CHAR(9),
	Cno CHAR(4),
    Grade SMALLINT,
    PRIMARY KEY(Sno,Cno)		/*主码多个属性组成,必须在表级定义*/
);

(5)有多个候选码时定义实体完整性

​ 定义院系表的实体完整性,其中院系编码Dno和Dname,DeanNo都是候选码,选择Dno作为主码,Dname上定义唯一性约束。

CREATE TABLE department(
	Dno CHAR(9) PRIMARY KEY,
    Dname CHAR(25) UNIQUE,
    DeanNo CHAR(9) UNIQUE
);

(6)删除实体完整性

​ 删除院系实体的主码。

ALTER TABLE department DROP PRIMARY KEY;

(7)增加两条相同记录,验证实体完整性是否起作用

​ 插入两条主码相同的记录,会违反实体完整性约束。

INSERT INTO SC
VALUES("202004061","2",80);
INSERT INTO SC
VALUES("202004061","2",81);

在这里插入图片描述

5.实验总结

​ 通过实验练习了定义实体完整性的列级定义,表级定义等方法。加深了对实体完整性的理解。

6.思考题

(1)所有列级完整性约束都可以改写为表级完整性约束,而表级完整性约束不一定能改写成列级完整性约束。举例说明。

​ 当主码由多个属性构成时,就只能使用表级完整性约束,而不能改写为列级完整性约束,因为列级完整性约束只能对一个属性进行完整性约束。例如实验过程(4)中的完整性约束定义。

(2)什么情况下会违反实体完整性约束,DBMS将做何种违约处理?用实验验证。

​ 检查主码的各个属性是否为空,有一个为空就拒绝插入或修改。

​ 使用实验过程(5)中定义的表进行验证,这个表中的每个属性都是候选码,其中Dno定义为主码。进行以下验证:

INSERT INTO department(Dname,DeanNo)
VALUES("计算机系","215486210");
/*主码为空,拒绝执行*/
INSERT INTO department(Dno,DeanNo)
VALUES("20","215486210");
/*主码不为空,候选码Dname为空,可以插入*/
INSERT INTO department(Dno,DeanNo)
VALUES("20","215486212");
/*主码不唯一,拒绝执行*/
INSERT INTO department(Dno,DeanNo)
VALUES("21","215486210");
/*候选码DeanNo不唯一,拒绝执行*/

实验 3.2 参照完整性实验

1.实验目的

​ 掌握参照完整性的定义和维护方法。

2.实验内容和要求

​ 定义参照完整性,定义参照完整性的违约处理,删除参照完整性。写出两种方式定义参照完整性的SQL语句;创建表时定义参照完整性,创建表后定义参照完整性。

3.实验重点和难点

​ 实验重点:创建表时定义参照完整性。

​ 实验难点:参照完整性的违约处理定义。

4.实验过程

(1)创建表时定义参照完整性

​ 定义教师表的实体完整性,再定义课程表的参照完整性。

/*教师表的主键为Tno*/
CREATE TABLE teacher(
	Tno CHAR(9),
    Tname CHAR(25),
    Tsex CHAR(2),
    Tage SMALLINT,
    Tdept CHAR(20),
    Ttitle CHAR(20),
    PRIMARY KEY(Tno)
)
/*列级定义参照完整性*/
CREATE TABLE Course(	
	Cno CHAR(9) PRIMARY KEY,
	Cname CHAR(20),
    Ctype CHAR(5),
    Cdept CHAR(20),
    Chours SMALLINT,
    Ccredit SMALLINT,
    Cpno CHAR(9),
    Ctno CHAR(9) REFERENCES teacher(tno
);
/*表级定义参照完整性*/
CREATE TABLE Course(	
	Cno CHAR(9) PRIMARY KEY,
	Cname CHAR(20),
    Cpno CHAR(9),
    Ctype CHAR(5),
    Cdept CHAR(20),
    Chours SMALLINT,
    Ccredit SMALLINT,
    Ctno CHAR(9),
    Constraint FK_Course FOREIGN KEY(Ctno) REFERENCES teacher(tno)
);

(2)创建表后定义参照完整性

​ 定义课程表Course的参照完整性,被参照关系是表自身。

/*Cpno参照于Cno*/
ALTER TABLE Course
ADD CONSTRAINT FK_Course_cpno
FOREIGN KEY(Cpno) REFERENCES Course(Cno);

(3)定义参照完整性(外码由多个属性组成)

​ 定义一个成绩申诉记录表,主码为记录号,外码为Sno和Cno。

CREATE TABLE appeal_record(
	Aidx CHAR(10),
    Asno CHAR(9),
    Acno CHAR(9),
    CONSTRAINT FK_appeal_record FOREIGN KEY(Asno,Acno) REFERENCES SC(Sno,Cno)
);

(4)定义参照完整性的违约处理

​ 定义课程表的参照完整性,当被参照表被修改或删除时,设置参照表中相应记录的值为空值。

CREATE TABLE Course(	
	Cno CHAR(9) PRIMARY KEY,
	Cname CHAR(20),
    Cpno CHAR(9),
    Ctype CHAR(5),
    Cdept CHAR(20),
    Chours SMALLINT,
    Ccredit SMALLINT,
    Ctno CHAR(9),
    Constraint FK_Course FOREIGN KEY(Ctno) REFERENCES teacher(tno) ON DELETE SET NULL ON UPDATE SET NULL
);

(5)删除参照完整性

​ 删除课程表参照自身的外码的参照完整性。

ALTER TABLE Course DROP CONSTRAINT FK_course_cpno;

(6)验证参照完整性

​ 插入一个课程,tno为"000000000"的记录在教师表中不存在,违反参照完整性约束。

INSERT INTO Course(Cno,Ctno)
VALUES("105","000000000");

​ 因为违反参照完整性约束,拒绝执行该语句。

5.实验总结

​ 参照完整性类似实体完整性,可以在列级进行定义,也可以在表级进行定义。如果插入的元组违反参照完整性约束,默认将拒绝执行。也可以在定义参照完整性时定义违约处理。

6.思考题

​ 对于自引用表,例如课程表中的先修课程号引用该表的课程号,完成如下任务:

(1)写出课程表上的实体完整性和参照完整性。

​ 在实验过程(1)(2)中已完成了课程表的实体完整性和参照完整性的定义。对于自身的引用,需要在建立表之后添加参照完整性约束。

CREATE TABLE Course(	
	Cno CHAR(9) PRIMARY KEY,
	Cname CHAR(20),
    Cpno CHAR(9),
    Ctype CHAR(5),
    Cdept CHAR(20),
    Chours SMALLINT,
    Ccredit SMALLINT,
    Ctno CHAR(9),
    Constraint FK_Course FOREIGN KEY(Ctno) REFERENCES teacher(tno)
);
/*Cpno参照于Cno*/
ALTER TABLE Course
ADD CONSTRAINT FK_Course_cpno
FOREIGN KEY(Cpno) REFERENCES Course(Cno);

(2)在考虑实体完整性约束的情况下,试举出几种录入课程数据的方法。

​ 可以按照顺序插入课程数据,保证先修课程号存在。或者先插入课程数据,先修课程号将为空值,最后再修改先修课程号。

实验3.3 用户自定义完整性实验

1.实验目的

​ 掌握用户自定义完整性的定义和维护方法。

2.实验内容和要求

​ 针对具体应用语义,选择NULL/NOT NULL、DEFAULT、UNIQUE、CHECK等,定义属性上的约束条件。

3.实验重点和难点

​ 实验重点:NULL/NOT NULL,DEFAULT。

​ 实验难点:CHECK。

4.实验过程

(1)定义属性NULL/NOT NULL约束

​ 定义课程表各属性的NULL/NOT NULL属性。

CREATE TABLE Course(	
	Cno CHAR(9) PRIMARY KEY,
	Cname CHAR(20) NOT NULL,	/*课程名非空*/
    Cpno CHAR(9) NULL,			/*先修课可为空*/
    Ctype CHAR(5),
    Cdept CHAR(20),
    Chours SMALLINT,
    Ccredit SMALLINT,
    Ctno CHAR(9),
    Constraint FK_Course FOREIGN KEY(Ctno) REFERENCES teacher(tno)
);

(2)定义属性DEFAULT约束

​ 定义课程表的Ctype缺省属性值为为通识选修课。

CREATE TABLE Course(	
	Cno CHAR(9) PRIMARY KEY,
	Cname CHAR(20) NOT NULL,	/*课程名非空*/
    Cpno CHAR(9) NULL,			/*先修课可为空*/
    Ctype CHAR(10) DEFAULT "通识选修",
    Cdept CHAR(20),
    Chours SMALLINT,
    Ccredit SMALLINT,
    Ctno CHAR(9),
    Constraint FK_Course FOREIGN KEY(Ctno) REFERENCES teacher(tno)
);

(3)定义属性UNIQUE约束

​ 定义院系表的名称属性Dname和院长工号属性DeanNo必须唯一的完整性约束。

CREATE TABLE department(
	Dno CHAR(9) PRIMARY KEY,
    Dname CHAR(25) UNIQUE,
    DeanNo CHAR(9) UNIQUE
);

(4)使用CHECK

​ 使用CHECK定义课程表中某些属性应该满足的约束。

CREATE TABLE Course(	
	Cno CHAR(9) PRIMARY KEY,
	Cname CHAR(20) NOT NULL,	/*课程名非空*/
    Cpno CHAR(9) NULL,			/*先修课可为空*/
    Ctype CHAR(10) DEFAULT "通识选修",
    Cdept CHAR(20),
    Chours SMALLINT,
    Ccredit SMALLINT,
    Ctno CHAR(9),
    Constraint FK_Course FOREIGN KEY(Ctno) REFERENCES teacher(tno),
    CHECK(Ctype IN ("通识选修","学类核心","学门核心","专业核心","专业选修")),		/*课程只有这几个类型*/
    CHECK(Ccredit>=0 AND Ccredit<=5)										 /*课程学分在0到5之间*/
);

(5)修改课程表的一条记录验证违反CHECK约束

​ 向课程表插入一条记录,不指定学分,该元组插入后将在Ccredit属性取空值,再修改ccredit为6。

INSERT INTO Course(Cno,Cname)
VALUES("1001","COURSE1");
UPDATE Course
SET Ccredit=6
WHERE Cno="1001";

​ 违反CHECK约束,拒绝执行修改语句。

在这里插入图片描述

5.实验总结

​ 用户自定义完整性主要包括NULL,NOT NULL,DEFAULT,UNIQUE,CHECK。创建表时,如果没有指定NOT NULL,属性默认可为NULL。使用CHECK约束后,违反约束的语句将拒绝执行。

6.思考题

(1)请分析哪些完整性约束只针对单个属性,哪些完整性约束可以针对多个属性?哪些只针对一个表,哪些针对多个表?

​ 在用户自定义完整性中,NULL/NOT NULL,DEFAULT,只针对单个属性,UNIQUE和CHECK可以针对单个属性,也可以针对多个属性。而实体完整性和参照完整性,既可以针对单个属性,也可以针对多个属性。用户自定义完整性和实体完整性针对一个表,参照完整性针对的是多个表。

(2)对表中某一列数据类型进行修改时,要修改的列是否必须为空列?

​ 在MYSQL中,修改数据类型,如果可以将数据转换到修改的类型,例如将SMALLINT修改到足够长度的CHAR,列就不必须为空。如果不能转换数据到修改的类型,列就必须为空。
UNIQUE,CHECK。创建表时,如果没有指定NOT NULL,属性默认可为NULL。使用CHECK约束后,违反约束的语句将拒绝执行。

6.思考题

(1)请分析哪些完整性约束只针对单个属性,哪些完整性约束可以针对多个属性?哪些只针对一个表,哪些针对多个表?

​ 在用户自定义完整性中,NULL/NOT NULL,DEFAULT,只针对单个属性,UNIQUE和CHECK可以针对单个属性,也可以针对多个属性。而实体完整性和参照完整性,既可以针对单个属性,也可以针对多个属性。用户自定义完整性和实体完整性针对一个表,参照完整性针对的是多个表。

(2)对表中某一列数据类型进行修改时,要修改的列是否必须为空列?

​ 在MYSQL中,修改数据类型,如果可以将数据转换到修改的类型,例如将SMALLINT修改到足够长度的CHAR,列就不必须为空。如果不能转换数据到修改的类型,列就必须为空。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ Reference: Standard C++ Library reference: Containers: map: map: key_comp

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/key_comp/ 公有成员函数 <map> std::map::key_comp key_compare key_comp() const;返回键比较对象 返回容器用于比较键的比较对象的副本。map对象的比较对象在构造&#xff08;construction&#xff…

kubernetes 挂载传播

kubernetes 挂载传播 kubernetes 的 mountPropagation 翻译成中文就是挂载传播。挂载传播提供了共享卷挂载的能力, 它允许在同一个 Pod, 甚至同一个节点内, 在多个容器之间共享卷的挂载。 说白了就是在容器或 host 内的挂载目录中 再 mount 了一个别的挂载。 kubernetes 中 卷…

第18章 条件概率

第18章 条件概率 18.1蒙特霍尔困惑 对于上一章的三个门的问题&#xff0c;有一个漏洞。假设参赛者选择门A且门B后有一只山羊&#xff0c;刚好产生3个结果&#xff1a; 以上结果出现的概率分别是1/18,1/18,1/9。 在这些结果中&#xff0c;只有最后一个结果(C,A,B)&#xff0c…

Redis常见面试题(三)

目录 1、Redis String值最大存储多少? 2、Redis事务有什么用? 3、Redis事务相关的命令有哪几个? 4、Redis事务是原子性的吗? 5、Redis持久化有什么用? 6、Redis有哪几种持久化方式? 7、Redis持久化方式如何选择? 8、如何保证Redis中的数据都是热点数据? 9、Red…

vue前后端分离项目打包成app,部署成移动端

将vue项目打包成app,在手机上运行。 1. vue打包 npm run build 先将vue的前端项目打包成dist文件夹 2. 安装hbuilderX Hbuilder官网地址 3. hbuilderX 1&#xff09;新建项目 我是vue的&#xff0c;所以直接选择的h5app&#xff0c;然后起个名字&#xff0c;选择路径。 2…

微服务实用篇6-分布式搜索elasticsearch篇2

今天我们继续学习分布式搜索引擎elasticsearch&#xff0c;今天主要学习四个模块&#xff0c;分别为DSL查询文档&#xff0c;搜索结果处理&#xff0c;RestClient查询文档&#xff0c;还有最好演示一个旅游案例。下面开始今天的学习吧。 目录 一、DSL查询文档 1.1、DSL查询分…

Hadoop学习----软件安装

Hadoop源码下载重新编译 软件下载&#xff1a;https://hadoop.apache.org/releases.html 建议是下载源码包。 源码包和官方编译安装包有什么不一样呢&#xff1f; 正常情况下&#xff0c;非生产环境直接使用官方编译安装包即可&#xff0c;但是官方提供的安装包不支持本地库。…

ANTLR4入门(二):图示说明eclipse安装Antlr4IDE插件的过程

如果你能正常通过Eclipse Market找到antlr4的插件并正常安装&#xff0c;可以忽略本文。 如果不能&#xff0c;那多半是因为网络问题导致安装Antlr4IDE插件时无法下载文件造成的。我就遇到了这个问题&#xff0c;无法下载的原因很复杂&#xff0c;我不想去深究了&#xff0c;我…

WPF/XAML关于x:key和x:name的区别,全面解读超详细

x:key和x:name的区别 x:Keyx:Name用于xaml Resources&#xff0c;ResourceDictionary用在ResourceDictionary以外任何地方使用key访问xaml指定对象使用name访问xaml对象标识资源创建和引用&#xff0c;存在于 ResourceDictionary 中的元素唯一标识对象元素&#xff0c;以便于从…

【Spring】SpringCloud

目录 一、SpringCloud 二、微服务介绍 1.系统架构演变 1.1 单体应用架构 1.2 垂直应用架构 1.3 分布式架构 1.4 SOA架构&#xff08;面向服务的架构&#xff09; 1.5 微服务架构&#xff08;服务的原子化拆分&#xff09; 2.微服务架构介绍 2.1 问题&#xff1a; 2.2…

与新手一起快速了解「什么是次世代」?

次世代&#xff08;英文&#xff1a;Next Generation&#xff09;&#xff0c;源自日本语&#xff0c;即下一个时代&#xff0c;未来的时代。与传统游戏相比&#xff0c;次世代游戏是把次世代游戏开发技术融入到现代游戏之中&#xff0c;通过增加模型的面数和贴图的数据量并使用…

JDK8系列之使用Function函数式接口

一、函数式接口是jdk8的新特性之一&#xff0c;函数式接口是只包含一个抽象方法声明的接口。按分类主要分为四大接口类型: Function、Consumer、Predicate、Supplier。 接口参数返回值说明Supplier<T>无T供给型&#xff0c;无参&#xff0c;返回一个指定泛型的对象Consu…

设计解谜游戏的30堂课

设计解谜游戏的30堂课 文章目录1.什么是Eureka Moment&#xff1f;2.谜题与幽默是同构的3.最大限度提高Sparkle4.避免无意义的谜题5.惊喜是Sparkle的重要源泉6.有趣的事实是惊喜的源泉7.尤里卡时刻并不是自豪8.不同解密者所寻求的解密体验是不尽相同的9.尤里卡是可以分享的10.创…

OVS-DPDK

要使用 ovs-dpdk&#xff0c;需要在node上构建 DPDK 并使用相应的 DPDK flag重新构建 ovs。 OVS-DPDK需要从源码编译&#xff0c;因为高度依赖内核等所在机器的环境&#xff0c;并需要配置很多参数以达到高性能。这意味着很难提供一个ovs-dpdk docker镜像来满足所有情况。OVS-D…

推荐系统学习笔记-基于图的模型

由来 基于图的模型&#xff08; graph-based model &#xff09;是推荐系统中的重要内容。其实&#xff0c;很多研究人员把基于邻域的模型也称为基于图的模型&#xff0c;因为可以把基于邻域的模型看做基于图的模型的简单形式。 在研究基于图的模型之前&#xff0c;首先需要将…

毫米波传感器原理介绍:角度估计

前边两篇博文从距离和速度两个维度进行了介绍&#xff0c;本篇将沿着第三个维度&#xff0c;角度进行分析&#xff0c;这也是毫米波传感器原理介绍的最后一篇理论基础。还是老规矩&#xff0c;我们先把公式列出来。 假设雷达两个接收天线之间的距离为d&#xff0c;θ 是物体相…

IS-95前向链路系统误码率matlab仿真,包括扩频调制,匹配滤波,RAKE接收

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 前向链路指由基站发往移动台的无线通信链路&#xff0c;也称作下行链路。IS-95系统前向链路最多可以有64个同时传输的信道&#xff0c;它们是在PN序列上再采用正交的Walsh码进行区分的信道&#…

网上书店系统/书店管理系统的设计与实现

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

C51 ——433M 射频信号控制喇叭

遥控按下后信号怎么被接受接 接收后的表现 &#xff1a; 厂商会告诉我们 这款告诉我们 接收模块对应针脚输出高电平 。 遥控控制喇叭 #include "reg52.h" sbit switcher P1^1; // 把继电器IN口 接到 P1.1 sbit D0_ON P1^2; // 把433M 射频信号接收器D0 口 接到P1.…

postman上传文件(multipart/form-data请求)

postman上传文件&#xff08;multipart/form-data请求&#xff09; 背景 网页的form表单中&#xff0c;如果存在上传文件的表单&#xff0c;则需要将form标签设置enctype"multipart/form-data"属性&#xff0c;意思是将Content-Type设置成multipart/form-data。 那…