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

1.实验目的

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

2.实验内容和要求

定义实体完整性,删除实体完整性。能够写出两种方式定义实体完整性的 SQL 语句:创建表时、创建表后定义实体完整性。设计 SQL
语句验证完整性约束是否起作用。 定义参照完整性,定义参照完整性的违约处理,删除参照完整性。写出两种方式定义参照完整性的 SQL
语句:创建表时、创建表后定义参照完整性。 针对具体应用语义,选择 NULL/NOT NULL/DEFAULT/UNIQUE/CHECK
等,定义属性上的约束条件。

3.实验步骤和实验结果

(1)参照实验一供应商的表结构,创建供应商表(Supplier1)时定义实体完整性(列级实体完整性):
创建表supplier1:

CREATE TABLE supplier1 (
	suppkey INT PRIMARY KEY,#列级完整性
	NAME CHAR ( 100 ),
	address VARCHAR ( 100 ),
	nationkey INT,
	phone CHAR ( 30 ),
	acctbal DECIMAL ( 12, 2 ),
	COMMENT VARCHAR ( 100 ),
CONSTRAINT nationkey——supplier1 FOREIGN KEY ( nationkey ) REFERENCES nation ( nationkey ) 
);

查看supplier1:
DESC supplier1;
在这里插入图片描述

(2)参照实验一供应商的表结构,创建供应商表(Supplier2)时定义实体完整性(表级实体完整性):
创建表supplier2:

 CREATE TABLE supplier2 (
	suppkey INT,
	NAME CHAR ( 100 ),
	address VARCHAR ( 100 ),
	nationkey INT,
	phone CHAR ( 30 ),
	acctbal DECIMAL ( 12, 2 ),
	COMMENT VARCHAR ( 100 ),
	PRIMARY KEY ( suppkey ),#表级完整性
CONSTRAINT nationkey_supplier2 FOREIGN KEY ( nationkey ) REFERENCES nation ( nationkey ) 
);

查看supplier2:
DESC supplier2;
在这里插入图片描述

(3)参照实验一供应商的表结构,创建供应商表(Supplier3),先创建表再定义实体完整性:
创建表supplier3:

CREATE TABLE supplier3 (
	suppkey INT,
	NAME CHAR ( 100 ),
	address CHAR ( 100 ),
	nationkey INT,
	phone CHAR ( 30 ),
	acctbal DECIMAL ( 12, 2 ),
	COMMENT VARCHAR ( 100 ) 
);
ALTER TABLE supplier3 ADD CONSTRAINT pk_suppkey PRIMARY KEY ( suppkey );
ALTER TABLE supplier3 ADD CONSTRAINT pk_nationkey FOREIGN KEY ( nationkey ) REFERENCES nation ( nationkey );

查看supplier3:
DESC supplier3;
未定义实体完整性之前:
在这里插入图片描述

定义实体完整性之后:
在这里插入图片描述

(4)参照实验一供应关系表的结构,定义供应关系表(PartSupp1)的实体完整性:
创建表partsupp1:

CREATE TABLE partsupp1(
  partkey INT,
	suppkey INT,
	avaiqty INT,
	supplycost DECIMAL(10,2),
	comment VARCHAR(200),
	PRIMARY KEY(partkey,suppkey),
	CONSTRAINT partkey_partsupp1 FOREIGN KEY(partkey) REFERENCES part(partkey),
	CONSTRAINT suppkey_partsupp1 FOREIGN KEY(suppkey) REFERENCES supplier(suppkey)
	);

查看partsupp1:
DESC partsupp1;
在这里插入图片描述

(5)参照实验一国家表的结构,定义国家表(nation1)的实体完整性,其中 nationkey和 name 都是候选码,选择 nationkey 作主码,name 上定义唯一性约束:
创建nation1:

CREATE TABLE nation1(
    nationkey INT PRIMARY KEY,
	name CHAR(25) UNIQUE,
	regionkey INT,
	comment VARCHAR(150),
	CONSTRAINT region_nation1 FOREIGN KEY(regionkey) REFERENCES region(regionkey)
	);

查看nation1:
DESC nation1;
在这里插入图片描述

(6)给国家表(nation1)增加两条相同记录,验证实体完整性是否起作用:
第一次:
在这里插入图片描述

在这里插入图片描述

第二次:
在这里插入图片描述

结果说明实体完整性起作用了。
(7)删除国家表(nation1)的主码:
删除主码:
ALTER TABLE nation1 DROP PRIMARY KEY;#对表nation1进行删除操作
在这里插入图片描述

查看nation1:
在这里插入图片描述

现在nation1不再有主码。
(8)参照实验一地区表和国家表的结构,先定义地区表(region1)的实体完整性,再定义国家表(nation2)的列级参照完整性和国家表(nation3)的表级参照完整性:
建表:

CREATE TABLE region1 ( regionkey INT PRIMARY KEY, NAME CHAR ( 25 ), COMMENT VARCHAR ( 150 ) );
CREATE TABLE nation2 (
	nationkey INT PRIMARY KEY,
	NAME CHAR ( 25 ),
	regionkey INT,
	COMMENT VARCHAR ( 150 ),
	FOREIGN KEY ( regionkey ) REFERENCES region1 ( regionkey ) #列级完整性
	
);
CREATE TABLE nation3 (
	nationkey INT,
	NAME CHAR ( 25 ),
	regionkey INT,
	COMMENT VARCHAR ( 25 ),
	PRIMARY KEY ( nationkey ),
	CONSTRAINT regionkey_nation3 FOREIGN KEY ( regionkey ) REFERENCES region1 ( regionkey ) #表级完整性

);

查看:
在这里插入图片描述

(9)参照实验一订单明细表的结构,定义订单明细表(Lineitem1)的参照完整性:
创建表:

CREATE TABLE lineitem1 (
	orderkey INT,
	partkey INT,
	suppkey INT,
	linenumber INT,
	quantity INT,
	extendedprice DECIMAL ( 3, 2 ),
	tax DECIMAL ( 3, 2 ),
	returnflag CHAR ( 1 ),
	linestatus CHAR ( 1 ),
	shipdate DATE,
	commitdate DATE,
	receiptdate DATE,
	shipinstruct CHAR ( 25 ),
	shipmode CHAR ( 10 ),
	COMMENT VARCHAR ( 40 ),
	PRIMARY KEY ( orderkey, linenumber ),
	FOREIGN KEY ( orderkey ) REFERENCES orders ( orderkey ),
	FOREIGN KEY ( partkey ) REFERENCES part ( partkey ),
FOREIGN KEY ( suppkey ) REFERENCES supplier ( suppkey ) 
);

查看:
DESC lienitem1;
在这里插入图片描述

(10)删除国家表(nation3)的外码:

ALTER TABLE nation3 DROP FOREIGN KEY regionkey_nation3;

在这里插入图片描述

删除nation3的外码破坏了表级参照完整性,拒绝执行,因此无法删除。
(11)给国家表(nation3)插入一条记录,验证参照完整性是否起作用:
在这里插入图片描述
在这里插入图片描述

验证成功。
(12)定义国家表(nation4)的 regionkey 的缺省属性值为 0 值,表示其他地区:
创建表:

CREATE TABLE nation4 (
	nationkey INT PRIMARY KEY,
	NAME CHAR ( 25 ),
	regionkey INT DEFAULT 0,
	COMMENT VARCHAR ( 150 ),
FOREIGN KEY ( regionkey ) REFERENCES region ( regionkey ) 
);

查看:
DESC nation4;
在这里插入图片描述

(13)参照实验一订单明细表的结构,使用 CHECK 定义订单明细表(Lineitem2)中某些属性应该满足的约束。如:装运日期 < 签收日期,退货标记为 A,R 或 N 中某一个:
创建表:

CREATE TABLE lineitem2 (
	orderkey INT,
	partkey INT,
	suppkey INT,
	linenumber INT,
	quantity INT,
	extendedprice DECIMAL ( 3, 2 ),
	tax DECIMAL ( 3, 2 ),
	returnflag CHAR ( 1 ),
	linestatus CHAR ( 1 ),
	shipdate DATE,
	commitdate DATE,
	receiptdate DATE,
	shipinstruct CHAR ( 25 ),
	shipmode CHAR ( 10 ),
	COMMENT VARCHAR ( 40 ),
	PRIMARY KEY ( orderkey, linenumber ),
	FOREIGN KEY ( orderkey ) REFERENCES orders ( orderkey ),
	FOREIGN KEY ( partkey ) REFERENCES part ( partkey ),
	FOREIGN KEY ( suppkey ) REFERENCES supplier ( suppkey ),
	CHECK ( shipdate < receiptdate ),
	CHECK (
	returnflag IN ( 'A', 'R', 'N' )) 
);

查看:
在这里插入图片描述

(14)参照实验一订单明细表的结构,为订单明细表(Lineitem2)中某些属性(零件编号 partkey,和供应商编号 suppkey)增加非空约束:

ALTER TABLE lineitem2 CHANGE COLUMN partkey NOT NULL;
ALTER TABLE lineitem2 CHANGE COLUMN suppkey NOT NULL;

在这里插入图片描述

修改外键可能会破坏参照完整性约束,因此会拒绝执行。
(15)修改 Lineitem2 的记录,验证第(13、14)题中定义的约束是否起作用:
插入一条记录:
在这里插入图片描述在这里插入图片描述

验证:
在这里插入图片描述
在这里插入图片描述

4.实验总结

(1)可能破坏参照完整性的情况及违约处理:
在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库设计是指在规划和设计关系型数据库时,需要考虑数据库的结构、数据类型和数据关系,以满足用户需求、提高数据访问效率和保证数据完整性。以下是一个数据库设计的步骤: 1. 需求分析:收集用户的需求,确定数据库的功能、数据存储方式和数据访问方式。 2. 数据建模:使用数据建模工具,设计数据库的实体、属性和关系,生成ER图。 3. 数据库规范化:将ER图转换为关系模型,消除冗余数据,提高数据存储效率。 4. 数据库设计:根据关系模型设计数据库表结构、数据类型、约束和索引。 5. 数据库实现:使用SQL语言创建数据库、表、视图、索引、存储过程和触发器等对象,并插入数据。 6. 数据库测试:对数据库进行功能测试、性能测试和安全测试,验证数据访问的正确性和有效性。 7. 数据库维护:定期备份和恢复数据库,优化数据库性能,修复数据库错误和漏洞,保证数据安全和可靠性。 在数据库设计过程中,需要考虑以下几个方面: 1. 数据库范式:数据库范式是一种规范化的设计方法,用于消除冗余数据和提高数据存储效率。常用的数据库范式有第一范式、第二范式、第三范式等。 2. 数据库性能:数据库性能是指数据库的响应速度、并发处理能力和数据访问效率等。优化数据库性能可以通过合理设计表结构、建立索引、使用存储过程和触发器等方式实现。 3. 数据库安全:数据库安全是指保护数据库免受非法访问、恶意攻击和数据泄露等威胁。应该采取有效的授权、认证、加密和审计等措施,保证数据库的安全性和可靠性。 4. 数据库扩展性:数据库扩展性是指数据库支持的容量、并发用户数和应用场景的可扩展性。应该采用可扩展的数据库架构、分布式数据库和云数据库等技术,保证数据库的扩展性和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值