数据库
首页 > 数据库> > (数据库系统概论|王珊)第五章数据库完整性-第一、二、三节:数据库三大完整性

(数据库系统概论|王珊)第五章数据库完整性-第一、二、三节:数据库三大完整性

作者:互联网

文章目录

(数据库系统概论|王珊)第二章关系数据库-第二节、第三节:关系操作和关系完整性这一节中对数据库的三大完整性已有介绍,而本章的内容就是如何在SQL语言中实现这些完整性规则

一:数据库完整性概述

(1)数据库完整性的基本概念

数据库完整性:数据库的完整性是指数据的正确性相容性

(2)数据库完整性和安全性的区别

完整性:是为了防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据。因此,完整性检查和控制的防范对象是不合语义的、不正确的数据,防止它们进入数据库

安全性:是保护数据库防止恶意破坏和非法存取。因此,安全性控制的防范对象是非法用户和非法操作,防止他们对数据库数据的非法存取

(3)为维护完整性DBMS必须要实现的功能

1.提供定义完整性约束条件的机制

2.提供完整性检查的方法

3.进行违约处理

二:实体完整性

实体完整性:若属性A是基本关系 R R R的主属性,则属性A不能取空值

(1)定义实体完整性

定义方法:关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。注意

演示

如下有几个典型的例子

将Student表中的Sno属性定义为码

(1)在列级定义主码
CREATE TABLE Student
(
	Sno CHAR(9) PRIMARY KEY,
	Sname CHAR(20) NOT NULL,     
	Ssex CHAR(2) ,
	Sage SMALLINT,
	Sdept CHAR(20)
);

(2)在表级定义主码
CREATE TABLE Student
(
	Sno CHAR(9),  
	Sname CHAR(20) NOT NULL,
	Ssex CHAR(2) ,
	Sage SMALLINT,
	Sdept CHAR(20),
	PRIMARY KEY (Sno)
); 

(3)将SC表中的Sno,Cno属性组定义为码
CREATE TABLE SC
(
	Sno CHAR(9) NOT NULL, 
	Cno CHAR(4) NOT NULL,  
	Grade SMALLINT,
	PRIMARY KEY (Sno,Cno)     /*只能在表级定义主码*/
); 

(2)实体完整性检查和违约处理

每当插入或对主码列进行更新操作时,DBMS按照实体完整性规则自动进行检查,包括

其中检查记录中主码值是否唯一有两种方法

三:参照完整性

(1)定义参照完整性

定义方法:关系模型的参照完整性在CREATE TABLE中用FOREIGN KEY定义,同时用REFERENCES短语指明这些外码参照哪些表的主码

演示

定义sc表的时候,其(Sno,Cno)是主码,分别参照Sudent的主码和Course表的主码

CREATE TABLE SC
(
	Sno CHAR(9) NOT NULL,
	Sno CHAR(4) NOT NULL,
	Grade SMALLINT,
	
	PRIMARY KEY(Sno,Cno),
	FOREIGN KEY(Sno) REFERENCES Student(Sno),
	FOREIGN KEY(Cno) REFERENCES Course(Cno)
);

(2)参照完整性检查和违约处理

A:破坏完整性的行为

参照完整性将表与表联系在了一起,所以对其中一个表的修改很可能会影响到另外一张表

举个例子,被参照表是Student,参照表是sc,破坏参照完整性的行为及其违约处理如下表所示

在这里插入图片描述

对于参照表sc的行为

对于被参照Student的行为

B:违约处理措施

①:拒绝

拒绝:不允许该操作执行,为默认策略

②:级联

级联:当删除或修改Student表(被参照表)的一个元组导致与sc表(参照表)不一致时,则会删除或修改sc表(参照表)中的所有导致不一致的元组

③:设为空值

假设有下面两个关系(划线为主码)
在这里插入图片描述


设为空值:当删除或修改专业表(被参照表)的一个元组时造成了不一致,则学生表(参照表)中的所有造成不一致的元组的对应属性(专业号)设为空值

其中关于外码是否可以取空值,在前面的文章已经有详细介绍:(数据库系统概论|王珊)第二章关系数据库-第二节、第三节:关系操作和关系完整性

C:SQL实现

综上,在定义完整性约束时还要给出相应的处理策略

CREATE TABLE SC
(
	Sno CHAR(9)
	Sno CHAR(4) 
	Grade SMALLINT,//是外码也是主码,故不能取空值,实体完整性
	PRIMARY KEY(Sno,Cno),
	FOREIGN KEY(Sno) REFERENCES Student(Sno)
		ON DELETE CASCADE //删除Student表的元组时,级联删除本表相应元组
		ON UPDATE CASCADE, //更新Student表中的Sno时,级联更新本表相应元组
	FOREIGN KEY(Cno) REFERENCES Course(Cno)
		ON DELETE NO ACTION //删除Course表的元组造成不一致时,拒绝执行
		ON UPDATE CASCADE //更新Course表中的Cno时,级联更新本表相应元组
);

四:用户自定义完整性

用户自定义完整性针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求

(1)属性上的约束条件

A:不允许取空值(NOT NULL)

演示

CREATE TABLE SC
(
	Sno CHAR(9),
	Cno CHAR(4),
	Grade SMALLINT NOT NULL,
	PRIMARY KEY(Sno,Cno)//定义了实体完整性,隐含了不允许取空值,在列级中可不写
);

B:列值唯一(UNIQUE)

演示

CREATE TABLE DEPT
(
	Deptno NUMERIC(2),
	Dname CHAR(9) UNIQUE NOT NULL, //唯一且不能取空值
	Location CHAR(10),
	PRIMARY KEY(Depto)
);

C:满足指定条件(CHECK)

演示

例如Ssex只能取“男”或“女”

CREATE TABLE Student
(
	Sno CHAR(9) PRIMARY KEY,
	Sname CHAR(8) NOT NULL,
	Ssex CHAR(2) CHECK(Ssex IN ('男','女')),
	Sage SMALLINT,
	Sdept CHAR(20)
);

例如Grade的取值范围为[0,100]

CREATE TABLE SC
(
	Sno CHAR(9),
	Cno CHAR(4),
	Grade SMALLINT CHECK(Grade >= 0 AND Grade <= 100),
	
	PRIMARY KEY(Sno,Cno),
	FOREIGN KEY(Sno) REFERENCES Student(Sno),
	FOREIGN KEY(Cno) REFERENCES Course(Cno)
);

(2)元组上的约束条件

同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件

演示

例如,规定插入男性时,其名字不能以Ms.开头

CREATE TABLE Student
(
	Sno Char(9),
	Sname CHAR(8) NOT NULL,
	Ssex CHAR(2),
	Sage SMALLINT,
	Sdept CHAR(20),
	PRIMARY KEY(Sno),

	CHECK(Ssex='女' OR Sname NOT LIKE 'Ms.%')

);

标签:参照,王珊,数据库,元组,CHAR,完整性,Student,Sno
来源: https://blog.csdn.net/qq_39183034/article/details/122641528