数据库完整性

  

本节要点:

  • 实体完整性
  • 参照完整性
  • 用户定义的完整性
  • 完整性约束命名子句
  • 触发器

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

例如,学生的学号必须唯一;性别只能是男或女;本科学生年龄的取值范围为14~50的整数;学生选的课程必须是学校开设的课程;学生所在的院系必须是学校已经成立的院系等。

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

为维护数据库的完整性,DBMS必须:

  • 提供定义完整性约束条件的机制
  • 提供完整性检查的方法
  • 违约处理

1         实体完整性

1.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));

示例:将SC表中的Sno,Cno属性组定义为码(多属性构成的码)

CREATE TABLE SC

(Sno   CHAR(9)  ,

Cno  CHAR(4)  ,

Grade    SMALLINT,

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

);

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

插入或对主码列进行更新操作时,RDBMS自动进行检查:

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

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

2         参照完整性

2.1       参照完整性定义

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

例如,关系SC中一个元祖表示一个学生选修的某门课程的成绩,(Sno,Cno)是主码。Sno,Cno分别参照Student表的主码和Course表的主码。

示例:定义SC中的参照完整性

CREATE TABLE SC

(Sno       CHAR(9),

Cno       CHAR(4),

Grade     INT,

PRIMARY KEY (Sno, Cno), /*在表级定义实体完整性*/

FOREIGN KEY (Sno) REFERENCES Student (Sno) ,

FOREIGN KEY (Cno) REFERENCES Course(Cno) /*表级定义参照完整性*/

);

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

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

例如,对表SC和Student有四种可能破坏参照完整性的情况,如下表:

1)         SC表中增加一个元组,该元组的Sno属性的值在表Student中找不到一个元组,其Sno属性的值与之相等。

2)         修改SC表中的一个元组,修改后该元组的Sno属性的值在表Student中到不到一个元组,其Sno属性的值与之相等。

3)         从Student表中删除一个元组,造成SC表中某些元组的Sno属性的值在Student中找不到一个元组,其Sno属性的值与之相等。

4)         修改Student表中的一个元组的Sno属性,造成SC表中某些元组的Sno属性的值在Student中找不到一个元组,其Sno属性的值与之相等。

当上述的不一致发生时,系统可以采用以下的策略加以处理:

1)         拒绝(NO ACTION)执行

默认策略

2)         级联(CASCADE)操作

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

例如,删除Student表中的元组,Sno值为200215121,则要从SC表中级联删除SC.Sno=’ 200215121’的所有元组。

3)         设置为空值(SET NULL)

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

学生(学号,姓名,性别,专业号,年龄)

专业(专业号,专业名)

学生关系的“专业号”是外码,因为专业号是专业关系的主码。

假设专业表中某个元组被删除,专业号为12,按照设置为空值的策略,就要把学生表中专业号=12的所有元组的专业号设置为空值。这就对应了这样的语义:某个专业删除了,该专业所有学生专业未定,等待重新分配专业。

但是并不是所有情况都适用于这种策略。比如,删除Student表中的元组,Sno值为200215121,则要从SC表中把SC.Sno=’ 200215121’的所有元组中Sno的值置空,这样一来SC表中就剩下单独的一个Cno,表示某个不知名的学生选了一门或多门课,这不符合现实应用逻辑。

示例:显式说明参照完整性的违约处理示例

CREATE TABLE SC

(Sno   CHAR(9)  NOT NULL,

Cno   CHAR(4)  NOT NULL,

Grade  INT,

PRIMARY KEY(Sno,Cno),

FOREIGN KEY (Sno) REFERENCES Student(Sno)

                        ON DELETE CASCADE     /*级联删除SC表中相应的元组*/

ON UPDATE CASCADE /*级联更新SC表中相应的元组*/

FOREIGN KEY (Cno) REFERENCES Course(Cno)

);

3         用户定义的完整性

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

3.1       属性上的约束条件的定义

在CREATE TABLE中定义属性的同时可以根据应用要求,定义属性上的约束条件,即属性值限制,包括:

  • 列值非空(NOT NULL)
  • 列值唯一(UNIQUE)
  • 检查列值是否满足一个布尔表达式(CHECK)

1.不允许取空值

示例: 在定义SC表时,说明Sno、Cno、Grade属性不允许取空值。

CREATE TABLE SC

(Sno  CHAR(9) ,

Cno  CHAR(4) ,

Grade  SMALLINT NOT NULL

PRIMARY KEY (Sno, Cno),

/* 表级定义实体完整性已隐含了Sno,Cno不允许取空值* /

);

2.列值唯一

示例:建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码

CREATE TABLE DEPT

(Deptno  NUMERIC(2),

Dname  CHAR(9)  UNIQUE,/*要求Dname列值唯一*/

Location  CHAR(10),

PRIMARY KEY (Deptno)

);

3. 用CHECK短语指定列值应该满足的条件

示例:Student表的Ssex只允许取“男”或“女”。

CREATE TABLE Student

(Sno  CHAR(9) PRIMARY KEY,

Sname CHAR(8) NOT NULL,

Ssex  CHAR(2)  CHECK (Ssex IN (‘男’,‘女’) )

/*性别属性Ssex只允许取‘男‘或‘女‘ */

Sage  INT,

Sdept  CHAR(20)

);

3.2       元组上的约束条件的定义

在CREATE TABLE时可以用CHECK短语定义元组上的约束条件,即元组级的限制。同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件 。

示例: 当学生的性别是男时,其名字不能以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.%‘)

/*定义了元组中Sname和 Ssex两个属性值之间的约束条件*/

);

性别是女性的元组都能通过该项检查,因为Ssex=‘女’成立;当性别是男性时,要通过检查则名字一定不能以Ms.打头。

4         完整性约束命名子句

以上讲解的完整性约束条件都在CREATE TABLE语句中定义。SQL还在CREATE TABLE语句中提供了完整性约束名子句CONSTRAINT,用来对完整性约束条件命名。从而可以灵活地增加、删除完整性约束条件。

4.1       完整性约束命名子句

语法格式:

CONSTRAINT<完整性约束条件名>[PRIMARY KEY 短语|FOREIGN KEY短语|CHECK 短语]

示例:建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。

CREATE TABLE Student

(Sno  NUMERIC(6) CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),

Sname  CHAR(20) CONSTRAINT C2 NOT NULL,

Sage  NUMERIC(3) CONSTRAINT C3 CHECK (Sage < 30),

Ssex  CHAR(2) CONSTRAINT C4 CHECK (Ssex IN ( ‘男‘,‘女‘)),

CONSTRAINT StudentKey PRIMARY KEY(Sno)

);

4.2       修改表中的完整性限制

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

示例:修改表Student中的约束条件,要求学号改为在900000~999999之间。(可以先删除原来的约束条件,再增加新的约束条件)

1)         ALTER TABLE Student DROP CONSTRAINT C1;

2)         ALTER TABLE Student ADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000 AND 999999);

5         触发器

触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程。一旦定义,任何用户对表的增、删、改操作均由服务器自助激活相应的触发器,在DBMS核心层进行集中的完整性控制。可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力。

定义触发器语法格式:

  CREATE TRIGGER <触发器名>

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

    FOR EACH {ROW|STATEMENT}

    [WHEN <触发条件>]

    <触发动作体>

详细说明:

1)         表的拥有者即创建表的用户才可以在表上创建触发器,并且一个表上只能创建一定数量的触发器

2)         当这个表的数据发生变化时,将激活定义在该表上相应<触发事件>的触发器

3)         触发事件可以是insert、delete或update,也可以是这几个事件的组合,如insert or update等。Update后面还可以有of<触发列,…>,即进一步指明修改哪些列时触发器激活

4)         触发器按照所触发动作的间隔尺寸可以分为行级触发器(for each row)和语句级触发器(for each statement)。

行级触发器和语句级触发器区别:如果使用的是语句级触发器,那么触发器只会在相应的语句(eg:update)执行或者是执行之后执行一次,一般情况下不会这样使用;而对于行级触发器,相应的语句(eg:update)有影响到几行记录,就执行几次触发器。

5)         触发器被激活时,只有当触发条件为真时触发动作体才执行,否则触发动作体不执行。如果省略when触发条件,则触发动作体在触发器激活后立即执行

6)         触发动作体既可以是一个匿名的PL/SQL过程块,也可以是对已创建存储过程的调用。再一个行级触发器能够通过new和old获得update或者insert发生之前的新值和发生值之后的旧值。

示例:定义一个before行级触发器,为教师表定义完整性规则,“教授”的工资不得低于4000元,如果低于4000自动改为4000元。

CREATE TRIGGER tri_teacher /*在Teacher 表上定义触发器,触发事件是插入或更新*/

BEFORE INSERT or update ON Teacher

FOR EACH ROW  /*这是行级触发器*/

AS BEGIN  /*定义触发器动作体,这是一个PL/SQL过程块*/

IF (new.Job = ‘教授’) AND ( new.sal<4000) THEN/*在过程块中使用插入或更新后的值*/

new.sal:=4000;

END IF;

END tri_teacher;

触发器的执行顺序:

1)         执行该表上的before触发器

2)         激活触发器的SQL语句

3)         执行该表上的after触发器

对于同一个表上多个before(after)触发器,遵循“谁先创建谁先执行”的原则。

删除触发器语法:

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

示例:DROP TRIGGER tri_teacher ON Teacher;

时间: 2024-10-10 17:53:30

数据库完整性的相关文章

数据库 chapter 5 数据库完整性

第五章 数据库完整性 数据库的完整性是指数据库的正确性和相容性. 例如,学生学号必须唯一,性别只能是男或女等等: 和数据安全性的区别: 数据的完整性是为了防止数据库中存在不正确的数据,数据库的安全性是保护数据库防止恶意的破坏和非法的存取.因此,完整性检查和控制的防范对象是不合语义的,不正确的数据,防止它们进入数据库.安全性控制的防范对象是非法用户和非法操作,防止他们对数据库数据的非法存取. 为维护数据库的完整性,DBMS必须能够: 提供定义完整性约束条件的机制: 提供完整性检查的方法: 违约处理

SQL 数据库完整性

作者 : Dolphin 原文地址:http://blog.csdn.net/qingdujun/article/details/27109035 一.实体完整性定义 [例1]将Student表中的Sno属性定义为码. CREATE TABLE Student ( Sno CHAR(10) PRIMARY KEY, /*在列定义主码*/ Sname CHAR(20) NOT NULL, Sage SMALLINT ); 或者: CREATE TABLE Student ( Sno CHAR(10

数据库复习3——数据库完整性

数据库复习 CH5 完整性 5.1 完整性约束 数据库完整性是指数据库中数据在逻辑上的一致性.正确性.有效性和相容性,那么完整性约束就是指用户插入.修改和删除操作时,DBMS为了保证数据库逻辑上的一致性.正确性.有效性和相容性所必需要检查的约束条件 C.J.Date在<An Introduction to Database Systems>一书中描述了四种完整性约束: 类型约束 属性约束 关系变量约束 数据库约束 C.J.Date提出的理论多半是建立在他自创的Tutorial D这个概念型数据

复习六——数据库完整性

数据库完整性概念 数据库完整性是指保护数据库中数据的 正确性:数据的合法性 有效性:数据是否在有效范围内 相容性:指表示同一个事实的两个数据应该一致 完整性规则定义 D(Data):约束作用的数据对象 O(Operation):触发完整性检查的数据库操作,立即检查还是延迟检查. A(Assertion):数据对象要满足的断言或语义规则 C(Condition):受A作用的数据对象值的谓词 P(Procedure):违反完整性规则时触发的过程 完整性约束按约束作用类型分类 域完整性 域是一组具有相

第12讲:数据库完整性

大纲: 数据库完整性的概念及分类 SQL语言实现静态(列/关系)完整性 SQL语言实现动态完整性 一.前言 1. 数据库完整性是数据库的一种特性(在任何情况下的正确性.有效性和一致性),其由DBMS保证实现 ①广义完整性:语义完整性.并发控制.安全控制.故障恢复 ②狭义完整性:特指语义完整性,DBMS通常有专门的完整性管理机制与程序来处理语义完整性问题 2. 回顾关系模型中的三个完整性:实体完整性.参照完整性.用户自定义完整性 用户自定义完整性即是上述语义完整性,而这也是我们这讲的主题. 3.

数据库完整性和约束

数据库的完整性 数据库约束是保证数据库完整性的方法 ,数据库完整性分为实体完整性.域完整性和参照完整性 实体完整性 实体完整性要求表中的主键字段不能为空且不能重复: 域完整性 域完整性要求表中数据都在有效范围内: 参照完整性 参照完整性保证了相关联的表的数据一致性: 约束的使用 约束是保证表中数据完整性和一致性的手段,分为主键约束.外键约束.检查约束.唯一约束.非空约束五种: 主键约束 主键约束在每个数据表中只有一个,但主键约束可以有多个列组成: -- 添加主键约束 alter table ta

《数据库系统概论》 -- 5 数据库完整性

概念 数据库的完整性是指数据的正确性与相容性 正确性:数据是满足现实世界语义,反映当前状况 相容性:同一数据库对象在不同关系表中的数据是符合逻辑的 作用 防止数据库中存在不符合语义的不正确数据,防范对象对象是不合语义.不正确的数据 实体完整性--列级/表级约束条件 使用         关系模型实体完整性用PRIMARY KEY表示 说明         单码为主码,则该实体完整性约束可作为表级约束条件或列级约束条件 多码为主码,该实体完整性约束只可作为表级约束条件 检查         对基本

数据库原理-数据库完整性

关系数据库的完整性规则是数据库设计的重要内容.绝大部分关系型数据库管理系统RDBMS都可自动支持关系完整性规则,只要用户在定义(建立)表的结构时,注意选定主键.外键及其参照表,RDBMS可自动实现其完整性约束条件. 实体完整性 实体完整性指表中行的完整性.主要用于保证操作的数据(记录)非空.唯一且不重复.即实体完整性要求每个关系(表)有且仅有一个主键,每一个主键值必须唯一,而且不允许为“空”(NULL)或重复. 参照完整性 参照完整性(Referential Integrity)属于表间规则.对

数据库完整性及约束

转载请注明出自朱朱家园http://blog.csdn.net/zhgl7688 1.  数据完整性:常用三种类型的约束保证数据完整性有域(列)完整性.实体完整性.引用完整性. 2.  实体完整性:能够唯一标识表中的第一个记录. 保证方法有主键约束.标识约束.唯一约束. 主键约束与唯一约束添加的基本语法 Alter  table  表名 addconstraint  约束名  约束类型  具体的约束说明 约束名的取名规则:约束类型_约束字段. 比如主键(Primary Key)约束:PK_Stu