数据库实验3 完整性语言实验

news2025/7/7 3:30:14

实验3 完整性语言实验

实验3.1实体完整性实验

1.实验目的

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

2.实验内容和要求

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

3.实验过程

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

CREATE TABLE Supplier1 (
	suppkey INT PRIMARY KEY,
	name CHAR(100),
	address VARCHAR(100),
	nationkey INT,
	phone CHAR(30),
	acctbal NUMERIC(12, 2),
	comment VARCHAR(100)
);

DESC Supplier1;

运行结果如下:

在这里插入图片描述

(2)创建供应商表(Supplier2)时定义实体完整性(表级实体完整性)

CREATE TABLE Supplier2 (
	suppkey INT,
	name CHAR(100),
	address VARCHAR(100),
	nationkey INT,
	phone CHAR(30),
	acctbal NUMERIC(12, 2),
	comment VARCHAR(100),
	PRIMARY KEY (suppkey)
);

DESC Supplier2;

运行结果如下:

(3)创建供应商表(Supplier3),在创建表后再定义实体完整性。

CREATE TABLE Supplier3 (
	suppkey INT,
	name CHAR(100),
	address VARCHAR(100),
	nationkey INT,
	phone CHAR(30),
	acctbal NUMERIC(12, 2),
	comment VARCHAR(100)
);

DESC Supplier3;

ALTER TABLE Supplier3
CHANGE COLUMN suppkey suppkey INT PRIMARY KEY;

DESC Supplier3;

运行结果:

在这里插入图片描述

(4)定义供应关系表(PartSupp1)的实体完整性

主码由多个属性组成

CREATE TABLE partsupp1 (
	partkey INT,
	suppkey INT,
	avialqty INT,
	supplycost NUMERIC(10, 2),
	comment VARCHAR(200),
	PRIMARY KEY (partkey, suppkey)
);

DESC partsupp1;

运行结果:

在这里插入图片描述

可以看到主码为(partkey, suppkey)

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

定义国家表(nation1)的实体完整性,其中nationkey和name 都是候选码,选择nationkey 作主码,name 上定义唯一性约束。

CREATE TABLE nation1 (
	nationkey INT PRIMARY KEY,
	name CHAR(25) UNIQUE,
	regionkey INT,
	comment VARCHAR(150)
);

DESC nation1;

运行结果:

在这里插入图片描述

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

给国家表(nation1)增加两条相同记录

INSERT INTO nation1 VALUES(40,'中国',1,'');
SELECT * FROM nation1;
INSERT INTO nation1 VALUES(40,'中国',1,'');
SELECT * FROM nation1;

可以发现,会报错

在这里插入图片描述

(7)删除实体完整性

删除国家表(nation1)的主码

ALTER TABLE nation1 DROP PRIMARY KEY;
DESC nation1;

可以看到,即使删除了主码,其属性仍不为空

在这里插入图片描述

4.思考题

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

多属性主码只能通过表级完整性约束定义。

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

当更新数据时,新的数据可能违反实体完整性约束。此时 DBMS 会拒绝执行。

实验3.2参照完整性实验

1.实验目的

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

2.实验内容和要求

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

3.实验过程

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

先定义地区表的实体完整性,再定义国家表上的参照完整性。

CREATE TABLE region1 (
	regionkey INT PRIMARY KEY,
	name CHAR(25),
	comment VARCHAR(150)
);

DESC region1;

CREATE TABLE nation2 (
	nationkey INT PRIMARY KEY,
	name CHAR(25),
	regionkey INT,
	FOREIGN KEY (regionkey) REFERENCES region1 (regionkey),
	comment VARCHAR(150)
);

DESC nation2;

运行结果:

在这里插入图片描述

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

定义国家表的参照完整性。

CREATE TABLE nation3 (
	nationkey INT PRIMARY KEY,
	name CHAR(25),
	regionkey INT,
	comment VARCHAR(150)
);

ALTER TABLE nation3
ADD CONSTRAINT fk_nationkey FOREIGN KEY (regionkey) REFERENCES region1 (regionkey);

DESC nation3;

在这里插入图片描述

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

定义订单项目表的参照完整性。

CREATE TABLE partsupp1(
	partkey INT,
	suppkey INT,
	availqty INT,
	supplycost NUMERIC(10,2),
	comment VARCHAR(200),
	PRIMARY KEY(partkey,suppkey)
);

CREATE TABLE lineitem1 (
	orderkey INT,
	partkey INT,
	suppkey INT,
	linenumber INT,
	quantity INT,
	extendedprice NUMERIC(8, 2),
	discount NUMERIC(3, 2),
	tax NUMERIC(3, 2),
	returnflag CHAR(1),
	linestatues CHAR(1),
	shipdate date,
	commitdate date,
	receiptdate date,
	shipinstruct CHAR(25),
	shipmode CHAR(10),
	comment VARCHAR(40),
	PRIMARY KEY (orderkey, linenumber),
	CONSTRAINT FOREIGN KEY (partkey,suppkey) REFERENCES partsupp1 (partkey,suppkey)
);

DESC lineitem1;

在这里插入图片描述

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

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

CREATE TABLE nation4 (
	nationkey INT PRIMARY KEY,
	name CHAR(25),
	regionkey INT,
	comment VARCHAR(150),
	CONSTRAINT fk_nation_regionkey FOREIGN key(regionkey) REFERENCES region1(regionkey)
	ON DELETE SET NULL ON UPDATE SET NULL
);

可以看到,当删除了regionkey为1的地区时,在nation表中其nationkey的值被设为空值

在这里插入图片描述

(5)插入一条国家记录,验证参照完整性是否起作用

INSERT INTO Nation3 (nationkey, name, regionkey, comment)
VALUES (1001, ' nation1 ', 1001, ' comment1 ');

在这里插入图片描述

报错,说明参照完整性起作用

(6)删除参照完整性

删除国家表的外码

ALTER TABLE nation4 DROP FOREIGN KEY fk_nation_regionkey;

可以看到,外键删除成功

在这里插入图片描述

4.思考题

对于自引用表,例如课程表(课程号、课程名、先修课程号、学分)中的先修课程号引用该表的课程号,请完成如下任务:
(1)写出课程表上的实体完整性和参照完整性。

CREATE TABLE COURSE(
    CNO CHAR(4),
    CNAME VARCHAR(40),
    CPNO CHAR(4),
    CCREDIT SMALLINT
);

ALTER TABLE COURSE
ADD PRIMARY KEY(CNO);

ALTER TABLE COURSE
ADD CONSTRAINT FK_CPNO
FOREIGN KET(CPNO) REFERENCES COURSE(CNO);

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

在录入数据时,可以按照引用的顺序录入数据(总是先录入不存在引用或引用已存在的数据),也可以临时移除完整性约束,在录入数据后,再添加完整性约束。
如果数据本身无法满足约束,则引入约束时会失败。

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

1.实验目的

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

2.实验内容和要求

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

3.实验过程

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

定义地区表各属性的NULL/NOT NULL属性。

CREATE TABLE region2 (
	regionkey INT NOT NULL PRIMARY KEY,
	name CHAR(25) NOT NULL,
	comment VARCHAR(150) NULL
);

DESC region2;

在这里插入图片描述

定义成功

(2)定义属性 DEFAULT约束

定义国家表的regionkey的缺省属性值为0值,表示其他地区。

CREATE TABLE nation5 (
	nationkey INT PRIMARY KEY,
	name CHAR(25),
	regionkey INT DEFAULT 0,
	FOREIGN KEY (regionkey) REFERENCES region1 (regionkey),
	comment VARCHAR(150)
);

DESC nation5;

在这里插入图片描述

(3)定义属性UNIQUE约束

定义国家表的名称属性必须唯一的完整性约束。

CREATE TABLE nation6 (
	nationkey INT PRIMARY KEY,
	name CHAR(25) UNIQUE,
	regionkey INT,
	comment VARCHAR(150)
);

DESC nation6;

在这里插入图片描述

(4)使用CHECK

使用CHECK定义订单项目表中某些属性应该满足的约束。

单明细表(Lineitem2)中某些属性应该满足的约束。如:装运日期< 签收日期,退货标记为A,R或N中某一个

CREATE TABLE lineitem2 (
	orderkey INT,
	partkey INT,
	suppkey INT,
	linenumber INT,
	quantity INT,
	extendedprice NUMERIC(8, 2),
	discount NUMERIC(3, 2),
	tax NUMERIC(3, 2),
	returnflag CHAR(1),
	linestatues CHAR(1),
	shipdate date,
	commitdate date,
	receiptdate date,
	shipinstruct CHAR(25),
	shipmode CHAR(10),
	comment VARCHAR(40),
	PRIMARY KEY (orderkey, linenumber),
	CONSTRAINT FOREIGN KEY (partkey,suppkey) REFERENCES partsupp1 (partkey,suppkey),
	CHECK (shipdate < receiptdate),
	CHECK (returnflag IN ('A', 'R', 'N'))
);

(5)修改Lineitem2的一条记录验证是否违反CHECK约束

首先插入数据

INSERT INTO lineitem2 (orderkey, linenumber, returnflag, shipdate, receiptdate)
VALUES (15, 20, 'A', '2022-11-29', '2022-12-31');
UPDATE lineitem2
SET returnflag = 'H'
WHERE orderkey = 15;

UPDATE lineitem2
SET shipdate = '2023-12-30'
WHERE orderkey = 15;

在这里插入图片描述

都会报错,不满足用户自定义CHECK约束

4.思考题

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

答:在列级完整性约束中,每个约束只能涉及到一个属性;在表级完整性约束中,每个约束可以涉及多个属性。实体完整性只针对一个表,参照完整性可以涉及多个表。用户定义完整性涵盖实体完整性和参照完整性。

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

假设字段有数据,则改为varchar2(40)执行时会弹出:“ORA-01439:要更改数据类型,则要修改的列必须为空”,这时要用下面方法来解决这个问题:

  • 修改原字段名name为name_tmp
    alter table tb rename column name to name_tmp;
  • 增加一个和原字段名同名的字段name
    alter table tb add name varchar2(40);
  • 将原字段name_tmp数据更新到增加的字段name
    update tb set name=trim(name_tmp);
  • 更新完,删除原字段name_tmp
    alter table tb drop column name_tmp;

总结:
1、当字段没有数据或者要修改的新类型和原类型兼容时,可以直接modify修改。
2、当字段有数据并用要修改的新类型和原类型不兼容时,要间接新建字段来转移。

5.实验总结

照完整性。

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

假设字段有数据,则改为varchar2(40)执行时会弹出:“ORA-01439:要更改数据类型,则要修改的列必须为空”,这时要用下面方法来解决这个问题:

  • 修改原字段名name为name_tmp
    alter table tb rename column name to name_tmp;
  • 增加一个和原字段名同名的字段name
    alter table tb add name varchar2(40);
  • 将原字段name_tmp数据更新到增加的字段name
    update tb set name=trim(name_tmp);
  • 更新完,删除原字段name_tmp
    alter table tb drop column name_tmp;

总结:
1、当字段没有数据或者要修改的新类型和原类型兼容时,可以直接modify修改。
2、当字段有数据并用要修改的新类型和原类型不兼容时,要间接新建字段来转移。

5.实验总结

通过本次实验,我掌握了实体完整性的定义和维护方法,动手操作了定义实体完整性,删除实体完整性,并且可以设计SQL语句验证完整性约束是否起作用。同时,掌握了参照完整性的定义和维护方法,动手体验了定义参照完整性,并且操作了定义参照完整性的违规处理以及删除参照完整性。除此之外,还掌握了用户自定义完整性的定义和维护此次实验使我学习了完整性相关知识,更促使我进一步学习。

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

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

相关文章

LeetCode 96. 不同的二叉搜索树

LeetCode 96. 不同的二叉搜索树 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#x…

我,30多岁的土木工程人,终于转行了

行外人可能没法想象&#xff0c;十年前最火爆、高校录取分数最高的土木工程专业&#xff0c;现在在贴吧知乎等社交网站上&#xff0c;竟然成了一个“劝退率”最高的专业。 土木出身的工程人&#xff0c;一边吐槽“土木毁我青春”&#xff0c;一边苦口婆心的劝退还在上学的学弟学…

一本通 1276:【例9.20】编辑距离

看完题目后&#xff0c;整个人都懵了&#xff0c;这题咋整&#xff1f; 哎呀&#xff0c;知道知道&#xff0c;用动态规划做 不要慌&#xff0c;我们慢慢分析.... 目录 做题前须知 状态转移 如果 a[i] b[j] 如果 a[i] ! b[j] 做删除操作 做插入操作 做替换操作 初始…

跑步热来袭!缤跃关注运动健康生活,跨界推出差异化酒店产品!

近期&#xff0c;人民数据研究院发布《2022全民跑步运动健康报告》&#xff0c;报告中显示参与跑步人群的年龄跨度随着社会对跑步运动不断攀升的热情而增加。现代生活节奏加快、竞争压力大使得部分中青年通过运动寻求解压&#xff0c;2022年18-40岁的跑者开始成为中坚力量&…

非零基础自学Golang 第15章 Go命令行工具 15.1 编译相关指令 15.1.3 install 15.1.4 交叉编译

非零基础自学Golang 文章目录非零基础自学Golang第15章 Go命令行工具15.1 编译相关指令15.1.3 install15.1.4 交叉编译第15章 Go命令行工具 15.1 编译相关指令 15.1.3 install go install命令的作用是编译后安装&#xff0c;该命令依赖于GOPATH&#xff0c;因此不能在独立的…

网上到处转行编程成功的,现实中真的容易吗?

首先&#xff0c;我先回答&#xff0c;转行编程真的这么简单么&#xff1f;答案是极其简单&#xff0c;但是也非常艰难。 这是一句正确的废话&#xff01; 其实&#xff0c;网上到处都是转行成功的案例。而我们现在也是在互联网上咨询&#xff0c;所以得到的答案会是什么答案…

转行IT,你需要了解的真实项目研发流程是怎样的?

本文以我在阿里写bug的项目流程为例子&#xff0c;介绍软件项目的研发一般流程&#xff0c;也可以作为企业开发流程的参考&#xff0c;让想转行IT的同学提前心里有个数。 一、职位分工 一般的大厂或者互联网软件公司&#xff0c;都会有如下职位。 1、产品经理 负责产品的设计&a…

json-server的学习笔记

文章目录json-server简介1、入门环境依赖安装2、基本使用2.1 启动jsonserver2.2 **json-server相关配置参数**2.3 jsonserver中的请求方法的作用3、筛选过滤4、分页5、排序6、切片(分页)7、特殊符号8、全文搜索9、关系10、数据库11、主页12、附加功能12.1 静态文件服务器12.2 替…

青少年等级考试【Python通关干货知识点】(一级)

青少年等级考试【Python通关干货知识点】&#xff08;一级&#xff09; 1. 编程模式 1&#xff09;交互式编程 在交互式环境的提示符>>>下&#xff0c;直接输入代码&#xff0c;按回车&#xff0c;就可以立刻得到代码执行结果。 交互式编程缺憾是没有保存下来&#x…

转行大数据,编程学Java还是Python?

Python和Java&#xff0c;是大数据行业最常见的两种编程语言&#xff0c;对于想转行大数据的人来说&#xff0c;学习哪个语言是比较好的选择呢&#xff1f; Python和大数据&#xff1a; Python本身的特点是高效率的开发和简单的维护&#xff0c;大数据运维领域也在普遍采用Pyth…

GridLayout案例

GridLayout-网格布局案例 1.网格布局-GridLayout 1.简介 无限细的线绘制的分割区域成行成列&#xff0c;和棋盘的样子差不多2.注意点 自己设置行数和列数自己控件在几行几列自己定义跨越的行数和列数自己设置子布局的排列的样式3.常见属性 4.网格布局属性 android:columnCount&…

【软件测试】测试人的懊恼,你要揭开的秘密复现bug......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 我们测试人常常会懊…

分布式微服务框架SpringCloud Alibaba学习(1)

springCloud 发展历史以及SpringCloud Alibaba概述 一.Why SpringCloud Alibaba? 1.微服务cloud新闻&#xff1a; 2020-12-22日Spring 官方博客宣布&#xff0c;Spring Cloud 2020.0.0正式发布。2020.0.0是第一个使用新的版本号命名方案的Spring Cloud 发行版本。在此之前S…

上次面试跪在了Redis上,刷完腾讯云大神亲码的“redis深度笔记”,终面进腾讯

前言 作为这个时代码代码的秃头人员&#xff0c;对Redis肯定是不陌生的&#xff0c;如果连Redis都没用过&#xff0c;还真不好意思出去面试&#xff0c;指不定被面试官吊打多少次。 毕竟现在互联网公司和一些创业公司都要用到Redis&#xff0c;像亚马逊、谷歌、阿里、腾讯都要使…

哈啰出行高质量故障复盘法:“3+5+3”(附模板)

# 一分钟精华速览 #故障复盘指的是及时把过去发生的错误&#xff0c;最大程度转化为未来可以规避的办法&#xff0c;其核心是不断减少失败因子繁衍的温床&#xff0c;将它们牢牢地掌控在不至于引发危机的范围之中。 作为国民基础设施的哈啰出行&#xff0c;在保障超5.3亿注册用…

按照等分份数或者分割点索引号列表将一个数组拆分为多个数组hsplit()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 按照等分份数或者分割点索引号列表 将一个数组拆分为多个数组 hsplit() [太阳]选择题 以下关于python代码表述有误的一项是? import numpy as np myArraynp.array([[0,1,2,3,4,5],[10,11,1…

“0基础、学历无优势、逻辑能力一般……”能转行做程序员吗?

此前&#xff0c;拉勾数据研究院对程序员群体做了一次深入调查&#xff0c;并发布了《2022程序员群体职场洞察报告》&#xff0c;报告显示&#xff0c;“高薪”依然是程序员的职业标签之一。在调查的程序员群体中&#xff0c;年薪在10-30万元之间的人数占比为66.7%&#xff0c;…

Sharding-JDBC(四)集成dynamic-datasource

目录1.Maven依赖2.yml配置3.DataSourceConfig.java4.TUserService.java5.TUserServiceImpl.java6.测试代码7.测试结果8.源码地址实现原理&#xff1a; 通过 DataSourceConfig.java 将ShardingJDBC数据源配置为动态数据源之一。通过 DS(DataSourceConfig.SHARDING_DATA_SOURCE_…

Coinbase Vntures:Web3社交堆栈指南

概述 Web3社交网络赋予用户对其数据、身份和关系的所有权及可移植性&#xff0c;同时支持无需许可的开发。 Web3社交堆栈有四层&#xff1a;托管、社交原语、profile和应用程序。 例如&#xff1a;Farcaster是一款类似twitter的社交应用程序&#xff0c;它创建在开放的社交图…

HTTPS协议的密钥交换流程

前言 HTTPS 常用的密钥交换算法有两种&#xff0c;分别是 RSA 和 ECDHE 算法。 其中&#xff0c;RSA 是比较传统的密钥交换算法&#xff0c;它不具备前向安全的性质&#xff0c;因此现在已很少服务器使用。而 ECDHE 算法具有前向安全&#xff0c;所以被广泛使用。 注&#xf…