数据库的完整性

导读:

本文深入的介绍了数据库的完整性.

O、 数据库的完整性(总体概述)

一、实体完整性

二、参照完整性

三、用户定义完整性

O、数据库的完整性

  • 数据的正确性

是指数据是符合现实世界语义,反映了当前实际情况。

  • 数据的相容性

是指数据库同一对象在不同关系表中的数据是符合逻辑的。

数据的完整性和安全性是两个不同概念

  • 数据的完整性

防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据

防范对象:不合语义、不正确的数据

  • 数据的安全性

保护数据库 防止恶意的破坏和非法的存取

防范对象:非法用户和非法操作

为维护数据库的完整性,数据库管理系统必须:

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

完整性约束条件也称为完整性规则,

是数据库中的数据必须满足的语义约束条件。

SQL标准使用了一系列概念来描述完整性,

包括关系模型的实体完整性/参照完整性和用户定义完整性。

这些完整性一般由SQL的数据定义语言语句来实现

2.提供完整性检查机制

数据库管理系统中检查数据是否满足完整性约束条件的机制称为完整性检查

一般在INSERT、 UPDATE、DELETE 语句执行后开始检查,

也可以再事务提交时检查

3.违约处理

数据库管理系统若发现用户的操作未被了完整性约束条件,就采取一定的行动。

拒绝(NO ACTION) 执行该操作

级连(CASCADE) 执行其他操作

由DBMS进行完整性检查的好处:

不必由应用程序来完成,从而减轻了应用程序员的负担。

能够为所有的用户和所有的应用提供一致的数据库完整性,避免出现漏洞。

一、实体完整性

1.实体完整性的定义

关系模型的实体完整性:

CREATE TABLE 中用 PRIMARY KEY 定义

->单属性构成的码有两种说明方法

* 定义为列级约束条件

* 定义为表级约束条件

->对多个属性构成的码只有一种说明方法

* 定义为表级约束条件

(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)

);

例子:

将SC 表中的Sno, Cno属性组定义为码

CREATE TABLE SC

{

Sno CHAR(9) NOT NULL,

Cno CHAR(4) NOT NULL,

Grade SMALLINT,

PRIMARY KEY (Sno,Cno) /*只能在 表级定义主码*/

}

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

插入或对主码列进行更新操作时,

关系数据库管理系统按照实体完整性规则自动进行检查。

1.查主码值是否唯一,如果不唯一则拒绝插入或修改。

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

检查激励中主码值是否唯一的一种方法是进行全表扫描。

依次判断表中每一条记录的主码值与将插入记录上的主码值(或则修改的新主码值)是否相同。

全表扫描的缺点:十分耗时

为避免对基本表进行全表扫描,RDBNS核心一般都在主码上自动建立一个索引。

二、参照完整性

1.参照完整性的定义

若属性(或属性组)F是基本关系R的外码它与基本关系S的主码Ks 相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为:

或取空值(F的每个属性均为空值)

或者等于S中某个元组的主码值

2.关系模型的参照完整性定义

在CREATE TABLE 中一百个 FOREIGN KEY 短语定义哪些列为外码。

用REFERENCES 短语指明这些外码参照哪些表的主码

例:Student表中的 Sdept是外码,参照DEPT表中的主码Deptno

列级约束条件

CREATE TABLE Student

( Sno CHAR(9) PRIMARY KEY,

Sname CHAR(20) UNIQUE,

Ssex CHAR(2),

Sage SMALLINT,

Sdept CHAR(20) FOREIGN KEY REFERENCES DEPT(Deptno)

);

表级约束条件

CREATE TABLE Student

( Sno CHAR(9) PRIMARY KEY,

Sname CHAR(20) UNIQUE,

Ssex CHAR(2),

Sage SMALLINT,

Sdept CHAR(20) ,

FOREIGN KEY(Sdept) REFERENCES DEPT(Deptno)

);

例:关系SC中(Sno, Cno)是主码。Sno, Cno分别参照 Studen t表的主码和 Course 表的主码。

CREATE TABLE SC

( Sno CHAR(9) NOT NULL,

Cno CHAR(4) NOT NULL,

Grade SMALLINT,

PRIMARY KEY (Sno, Cno),

FOREIGN KEY(Sno) REFERENCES Student(Sno),

FOREIGN KEY(Cno) REFERENCES Course(Cno)

)

3.参照完整性检查和违约处理

参照完整性检查

一个参照完整性将两个表中相应的元组联系起来。

对被参照表和参照表进行增删改操作时有可能破坏参照完整性,必须进行检查。

参照完整性违约处理

拒绝(NO ACTION)执行

不允许该操作执行。该策略一般设置为默认策略。

级联(CASCADE)操作

当删除或修改被参照表(Student)的一个元组造成了与参照表(SC)的不一致,则删除或者修改参照表中的所有造成不一样元组。

设置为空值(SET-NULL)

当删除或者修改被参照表的一个元组时造成了不一致,则将参照表中所有造成不一致的元组的对应属性设置为空值。

三、用户定义完整性

用户定义的完整性是:针对于某一具体应用的数据必须满足的语义要求。

关系数据库管理系统提供了定义和检验用户定义完整性的机制,不必由应用程序承担。

1、属性上的约束条件的定义

CREATE TABLE 时定义属性上的约束条件

列值非空(NOT NULL)

列值唯一(UNIQUE)

检查列值是否满足一个条件表达式(CHECK)

例:

Sname 唯一; Sage 不可空; Sage 必须是男或者女。

CREATE TABLE Student

( Sno CHAR(9) PRIMARY KEY,

Sname CHAR(20)UNIQUE,

Ssex CHAR(2)CHECK (Ssex IN ('男', '女')),

Sage SMALLINTNOT NULL,

Sdept CHAR(20) ,

);

2.属性上的约束条件检查和违约处理

插入元组或修改属性的值时,关系数据库管理系统RDBMS检查属性上的约束条件是否被满足。

如果不满足则操作被拒绝执行。

3.元组上的约束条件定义

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

例如:数据库课程的学分不能低于两分

在CREATE TABLE 时可以用 CHECK 子句定义元组上的约束条件

例:当学生性别是男时,其名字不能以Ms. 打头。

CREATE TABLE Student

( Sno CHAR(9) ,

Sname CHAR(20) NOT NULL,

Ssex CHAR(2),

Sage SMALLINT,

Sdept CHAR(20),

PRIMARY KEY (Sno),

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

);

4.元组上的约束条件检查和违约处理

插入元组或修改属性的值时,关系数据库管理系统检查元组上的约束条件是否被满足。

如果不满足则操作被拒绝执行。

PS:

DBMS:数据库管理系统

RDBMS:关系数据库管理系统

END

本文来自企鹅号 - python黑科技媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jackson0714

【SQL进阶】03.执行计划之旅1 - 初探

35970
来自专栏北京马哥教育

MySQL/MariaDB基础性知识及DDL操作详解

前言 MySQL/MariaDB是一个开放源码的小型关联式数据库管理系统,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降...

52760
来自专栏待你如初见

Day15

10830
来自专栏极客慕白的成长之路

SQL复杂查询语句

 进行多表连接查询,掌握多表连接查询的连接条件或连接谓词,理解内连接、左连接和右连接的含义并熟练操作。

15310
来自专栏idba

MySQL优化案例一则

有赞的每个OLTP数据库实例上会设置一个sql-killer进程用于kill 掉执行时间超过一定阈值的sql。下午开发接收到sql被kill的报错,一起帮助开...

10140
来自专栏battcn

MySQL - EXPLAIN详解

EXPLAIN: 为 SELECT语句中使用到的每个表返回一条信息。它按照MySQL在处理语句时读取它们的顺序列出这些表。MySQL使用循环嵌套算法解析所有连接...

12020
来自专栏程序猿

Mysql_基础

一、 简单查询 简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 表或视图、以及搜索条件等。 例...

36070
来自专栏Jackson0714

【SQL进阶】03.执行计划之旅1 - 初探

13310
来自专栏java一日一条

浅谈SQL语句的执行过程

写在前面的话:有时不理解SQL语句各个部分执行顺序,导致理解上出现偏差,或者是书写SQL语句时随心所欲,所以有必要了解一下sql语句的执行顺序。可以有时间自己写...

9520
来自专栏Java技术栈

设计模式之单例模式实践

概念 单例模式即一个JVM内存中只存在一个类的对象实例 ? 分类 1、懒汉式 类加载的时候就创建实例 2、饿汉式 使用的时候才创建实例 当然还有其他的生成单例的...

37150

扫码关注云+社区

领取腾讯云代金券