本文所属《数据库系统原理》分类专栏,相关文章导航请点击《数据库系统原理》目录汇总贴

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

  • 数据的正确性:是指数据是符合现实世界语义,反映了当前实际状况的

  • 数据的相容性:是指数据库同一对象在不同关系表中的数据是符合逻辑的

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

  • 数据的完整性:防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据。
    防范对象:不合语义的、不正确的数据。

  • 数据的安全性:保护数据库 防止恶意的破坏和非法的存取。
    防范对象:非法用户和非法操作。

一、实体完整性

1.定义实体完整性

关系模型的实体完整性:CREATE TABLE中用PRIMARY KEY定义

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

  • 定义为列级约束条件
  • 定义为表级约束条件

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

  • 定义为表级约束条件

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

插入或对主码列进行更新操作时,关系数据库管理系统按照实体完整性规则自动进行检查。包括:

  • 检查主码值是否唯一,如果不唯一则拒绝插入或修改
  • 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改

二、参照完整性

1.定义参照完整性

关系模型的参照完整性

  • CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码
  • REFERENCES(引用)短语指明这些外码参照哪些表的主码

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

一个参照完整性将两个表中的相应元组联系起来,对被参照表和参照表进行增删改操作时有可能破坏参照完整性,必须进行检查以保证两个表的相容性。

参照完整性违约处理:

(1) 拒绝(NO ACTION)执行
不允许该操作执行。该策略一般设置为默认策略。

(2) 级联(CASCADE)操作
当删除或修改被参照表(Student)的一个元组造成了与参照表(SC)的不一致,则删除或修改参照表中的所有造成不一致的元组。

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

对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值。

三、用户定义的完整性

用户定义的完整性是:针对某一具体应用的数据必须满足的语义要求。关系数据库管理系统提供了定义和检验用户定义完整性的机制,不必由应用程序承担。

1.属性上的约束条件

CREATE TABLE中定义属性时,可以定义属性上的约束条件,即属性值限制,包括:

  • 列值非空(NOT NULL)
  • 列值唯一(UNIQUE)
  • 检查列值是否满足一个条件表达式(CHECK短语)

往表中插入元组或修改属性时,若不满足约束条件,则操作拒绝执行。

2.元组上的约束条件

CREATE TABLE时可以用CHECK短语定义元组上的约束条件,即元组级的限制。

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

往表中插入元组或修改属性时,若不满足约束条件,则操作拒绝执行。

完整性约束命名子句

除了在CREATE TABLE定义完整性约束,还能用完整性约束命名子句CONSTRAINT对完整性约束条件命名。

1
CONSTRAINT <完整性约束条件名><完整性约束条件>

<完整性约束条件>包括NOT NULLUNIQUEPRIMARY KEY短语FOREIGN KEY短语CHECK短语等。

使用ALTER TABLE语句修改表中的完整性限制。

断言

在SQL中,可以使用 CREATE ASSERTION语句,通过声明性断言来指定更具一般性的约束。可以定义涉及多个表的或聚集操作的比较复杂的完整性约束。断言创建以后,任何对断言中所涉及的关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行。

创建断言的语句格式:

1
CREATE ASSERTION<断言名><CHECK 子句>

每个断言都被赋予一个名字,<CHECK 子句>中的约束条件与WHERE子句的条件表达式类似。

删除断言的语句格式为:

1
DROP ASSERTION <断言名>;

如果断言很复杂,则系统在检测和维护断言的开销较高,这是在使用断言时应该注意的。

触发器

触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程

  • 触发器保存在数据库服务器中
  • 任何用户对表的增、删、改操作均由服务器自动激活相应的触发器
  • 触发器可以实施更为复杂的检查和操作,具有更精细和更强大的数据控制能力

1.定义触发器

1
2
3
4
5
6
7
8
9
CREATE TRIGGER <触发器名> 

{BEFORE | AFTER} <触发事件> ON <表名>

REFERENCING NEW|OLD ROW AS<变量>

FOR EACH {ROW | STATEMENT}

[WHEN <触发条件>]<触发动作体>

2.激活触发器

触发器的执行,是由触发事件激活的,并由数据库服务器自动执行

一个数据表上可能定义了多个触发器,遵循如下的执行顺序:

(1) 执行该表上的BEFORE触发器;

(2) 激活触发器的SQL语句;

(3) 执行该表上的AFTER触发器。

3.删除触发器

删除触发器的SQL语法:

1
DROP TRIGGER <触发器名> ON <表名>;

触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除。


(小结与习题)

1.什么是数据库的完整性?

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

2.数据库的完整性概念与数据库的安全性概念有什么区别和联系?

数据的完整性和安全性是两个不同的概念,但是有一定的联系。前者是为了防止数据库中存在不符合语义的数据,防止错误信息的输入和输出,即所谓垃圾进垃圾出(GarbageInGarbageOut)所造成的无效操作和错误结果。后者是保护数据库防止恶意的破坏和非法的存取。也就是说,安全性措施的防范对象是非法用户和非法操作,完整性措施的防范对象是不合语义的数据。

3.什么是数据库的完整性约束条件?

完整性约束条件是指数据库中的数据应该满足的语义约束条件。一般可以分为六类:静态列级约束、静态元组约束、静态关系约束、动态列级约束、动态元组约束、动态关系约束。

4.关系数据库管理系统的完整性控制机制应具有哪三方面的功能?

DBMS的完整性控制机制应具有三个方面的功能:

(1) 定义功能,即提供定义完整性约束条件的机制;

(2) 检查功能,即检查用户发出的操作请求是否违背了完整性约束条件;

(3) 违约反应,如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性。

5.关系数据库管理系统在实现参照完整性时需要考虑哪些方面?

RDBMS在实现参照完整性时需要考虑以下几个方面:

(1)外码是否可以接受空值。

(2)删除被参照关系的元组时的考虑,这时系统可能采取的作法有三种:

  • 1)级联删除(CASCADES)

2)受限删除(RESTRICTED)
3)置空值删除(NULLIFIES)

(3)在参照关系中插入元组时的问题,这时系统可能采取的作法有:

  • 1)受限插入

2)递归插入。

(4)修改关系中主码的问题。一般是不能用UPDATE语句修改关系主码的。如果需要修改主码值,只能先删除该元组,然后再把具有新主码值的元组插入到关系中。如果允许修改主码,首先要保证主码的惟一性和非空,否则拒绝修改。然后要区分是参照关系还是被参照关系。

6.假设有下面两个关系模式:

职工(职工号,姓名,年龄,职务,工资,部门号),其中职工号为主码;
部门(部门号,名称,经理名,电话),其中部门号为主码。

用SQL语言定义这两个关系模式,要求在模式中完成以下完整性约束条件的定义:

(1)定义每个模式的主码;(2)定义参照完整性;(3)定义职工年龄不得超过60岁。

职工表定义:

1
2
3
4
5
6
7
8
9
10
CREATE TABIE Workers
( Wno NUMBER (4),
Wname VARCHAR (10),
WAge NUMBER (2),
CONSTRAINT Cl CHECK (WAge<=60),
Job VARCHAR(9),
Sal NUMBER(7, 2),
Deptno NUMBER (2),
CONSTRAINT WKey FOREIGN KEY (Deptno)
REFERENCES DEPT (Deptno)) ;

部门表定义:

1
2
3
4
5
6
7
CREATE TABLE DEPT
(Deptno NUMBER(2),
Dname VARCHAR (10),
Manager VARCHAR (10),
phoneNum VARCHAR(11)
CONSTRAINT DKey PRIMARY KEY (Deptno)
);

7.在关系系统中,当操作违反实体完整性、参照完整性和用户定义的完整性约束条件时,一般是如何分别进行处理的?

对于违反实体完整性和用户定义的完整性的操作一般都采用拒绝执行的方式进行处理。而对于违反参照完整性的操作,并不都是简单地拒绝执行,有时要根据应用语义执行一些附加的操作,以保证数据库的正确性。

8.某单位想举行一个小型的联谊会,关系Male记录注册的男宾信息,关系Female记录注册的女宾信息。建立一个断言,将来宾的人数限制在50人以内。(提示,先创建关系Female和关系Male。)

1
2
3
4
5
6
7
8
CREATE TABLE Female
( Fno CHAR(10) PRIMARY KEY
Fname CHAR(10) NOT NULL,
Fage SMALLINT);
CREATE TABLE Male
( Mno CHAR(10) PRIMARY KEY
Mname CHAR(10) NOT NULL,
Mage SMALLINT );

断言代码:

1
2
3
4
5
6
CREATE ASSERTION Pcount
CHECK(50>=(SELECT COUNT(*)
FROM (SELECT * FROM Male
UNION
SELECT * FROM Female)
AS num);

参考博文:

CSDN - https://blog.csdn.net/Flora_SM/article/details/84578148

CSDN - https://blog.csdn.net/weixin_45348240/article/details/105938868