我是靠谱客的博主 平淡哑铃,最近开发中收集的这篇文章主要介绍数据库完整性一.实体完整性二.参照完整性三.用户定义的完整性四.完整性约束命名子句五.断言六.触发器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

数据库完整性

  • 一.实体完整性
    • 1.实体完整性定义
    • 2.实体完整性检查和违约处理
  • 二.参照完整性
    • 1.参照完整性定义
    • 2.参照完整性检查和违约处理
  • 三.用户定义的完整性
    • 1.属性上的约束条件
    • 2.属性上的约束条件检查和违约处理
    • 3.元组上的约束条件
    • 4.元组上约束条件检查和违约处理
  • 四.完整性约束命名子句
    • 1.完整性约束命名子句
    • 2.修改表中的完整性限制
  • 五.断言
    • 1.创建断言的语句格式
    • 2.删除断言的语句格式
  • 六.触发器
    • 1.定义触发器
    • 2.激活触发器
    • 3.删除触发器

(1)数据库的完整性
①数据的正确性

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

②数据的相容性

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

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

a.防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据;
b.防范对象:不合语义的、不正确的数据。

②数据的安全性

a.保护数据库,防止恶意的破坏和非法的存取;
b.防范对象:非法用户和非法操作。

(3)为维护数据库的完整性,数据库管理系统必须:
①提供定义完整性约束条件的机制

a.完整性约束条件也称为完整性规则,是数据库中的数据必须满足的语义约束条件;
b.SQL标准使用了一系列概念来描述完整性,包括关系模型的实体完整性、参照完整性和用户定义完整性;
c.这些完整性一般由SQL的数据定义语言语句来实现。

②提供完整性检查的方法

a.数据库管理系统中检查数据是否满足完整性约束条件的机制称为完整性检查。
b.一般在INSERT、UPDATE、DELETE语句执行后开始检查,也可以在事务提交时检查。

③违约处理

数据库管理系统若发现用户的操作违背了完整性约束条件,就采取一定的动作:
a.拒绝(NO ACTION)执行该操作;
b.级联(CASCADE)执行其他操作。

一.实体完整性

1.实体完整性定义

①关系模型的实体完整性

CREATE TABLE中用PRIMARY KEY定义。

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

a.定义为列级约束条件:

  • 定义在单独字段上的约束,例如不可空等。

b.定义为表级约束条件:

  • 表级约束是定义在业务类型为表上的约束,例如主键、外键等约束。

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

定义为表级约束条件。

④例1:将Student表中的Sno属性定义为码:
a.在列级定义主码:

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

b.在表级定义主码:

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

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

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

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

②检查记录中主码值是否唯一的一种方法是进行全表扫描

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

在这里插入图片描述
③表扫描缺点:十分耗时。
④为避免对基本表进行全表扫描,RDBMS核心一般都在主码上自动建立一个索引。

⑤B+树索引
在这里插入图片描述

例如,新插入记录的主码值为25:
a.通过主码索引,从B+树的根节点开始查找;
b.读取3个节点:根节点(51)、中间节点(12、30)、叶节点(15、20、25);
c.该主码值已经存在,不能插入这条记录。

二.参照完整性

1.参照完整性定义

①在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码。

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

③例子

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

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

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

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

③参照完整性违约处理
在这里插入图片描述

a.拒绝(NO ACTION)执行

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

b.级联(CASCADE)操作

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

c.设置为空值(SET-NULL)

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

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

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

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)
 ON DELETE CASCADE //当删除Student表中的元组时,级联删除SC表中相应的元组
 ON UPDATE CASCADE //级联更新SC表中相应的元组
FOREIGN KEY(Cno) REFERENCES Course(Cno)
 ON DELETE NO ACTION //当删除course表中的元组造成了与SC表不一致时拒绝删除
 ON UPDATE CASCADE //当更新course表中的Cno时,级联更新SC表中相应的元组
);

三.用户定义的完整性

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

1.属性上的约束条件

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

a.列值非空(NOT NULL)
b.列值唯一(UNIQUE)
c.检查列值是否满足一个条件表达式(CHECK)

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

CREATE TABLE SC
(
Sno char(9) NOT NULL,
Cno char(4) NOT NULL,
Grade smallint NOT NULL,
PRIMARY KEY(Sno,Cno)
//如果在表级定义实体完整性,隐含了Sno、Cno不允许取空值,则在列级不允许取空值的定义可以不写
);

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

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

④用CHECK短语指定列值应满足的条件
例子:Student表的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)
);

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

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

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

3.元组上的约束条件

①在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.元组上约束条件检查和违约处理

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

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

四.完整性约束命名子句

1.完整性约束命名子句

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

①<完整性约束条件> 包括NOT NULL、UNIQUE、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)
);

//在Student表上建立了5个约束条件,包括主码约束(命名为StudentKey,表级约束)以及C1、C2、C3、C4四个列级约束。

③例子:建立教师表TEACHER,要求每个教师的应发工资不低于3000元:

CREATE TABLE TEACHER
(
Eno NUMERIC(4) PRIMARY KEY, 
Ename char(10),
Job char(8),
Sal NUMERIC(7,2),
Deduct NUMERIC(7,2),
Deptno NUMERIC(2),
CONSTRAINT TEACHERFKey FOREIGN KEY(Deptno) REFERENCES DEPT(Deptno),
CONSTRAINT C1 CHECK (Sal+Deduct>=3000)
);

2.修改表中的完整性限制

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

①例子:去掉Student表中对性别的限制:

ALTER TABLE Student
DROP CONSTRAINT C4;

②例子:修改表Student中的约束条件,要求学号改为在900000~999999之间,年龄由小于30改为小于40:

//可以先删除原来的约束条件,再增加新的约束条件
ALTER TABLE Student
DROP CONSTRAINT C1;
ALTER TABLE Student
ADD CONSTRAINT C1 CHECK(Sno BETWEEN 900000 AND 999999);

ALTER TABLE Student 
DROP CONSTRAINT C3;
ALTER TABLE Student
ADD CONSTRAINT C3 CHECK (Sage<40);

五.断言

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

1.创建断言的语句格式

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

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

②例子:限制数据库课程最多60名学生选修:

CREATE ASSERTION ASSE_SC_DB_NUM
CHECK (60>=(SELECT COUNT(*)
            FROM Course,SC
            WHERE SC.Cno=Course.Cno AND Course.Cname='数据库')
       );

③例子:限制每一门课程最多60名学生选修:

CREATE ASSERTION ASSE_SC_CNUM1
CHECK(60>=ALL(SELECT COUNT(*)
              FROM SC
              GROUP BY Cno)
     );

//此断言的谓词,涉及聚集操作COUNT和分组函数GROUP BY的SQL语句。

2.删除断言的语句格式

DROP ASSERTION <断言名>;

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

六.触发器

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

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

②触发器在SQL99才写入SQL标准,但很多关系数据管理系统在此标准写入之前就有自己的触发器,所以不同关系数据库管理系统实现的触发器语法各不相同、且互不兼容。

1.定义触发器

CREATE TRIGGER <触发器名>
{BEFORE | AFTER} <触发事件> ON <表名>
REFERENCES NEW | OLD ROW AS <变量>
FOR EACH {ROW | STATEMENT}
[WHEN <触发条件>] <触发动作体>

①触发器又叫做事件-条件-动作(event-condition-action)规则。

②当特定的系统事件发生时,对规则的条件进行检查,如果条件成立则执行规则中的动作,否则不执行该动作。规则中的动作体可以很复杂,通常是一段SQL存储过程。

③表的拥有者才可以在表上创建触发器。

④触发器名

a.触发器名可以包含模式名,也可以不包含模式名;
b.同一模式下,触发器名必须是唯一的;
c.触发器名和表名必须在同一模式下。

⑤表名

a.触发器只能定义在基本表上,不能定义在视图上;
b.当基本表的数据发生变化时,将激活定义在该表上相应触发事件的触发器。

⑥触发事件

a.触发事件可以是INSERT、DELETE或UPDATE,也可以是这几个事件的组合;
b.还可以UPDATE OF<触发列,…>,即进一步指明修改哪些列时激活触发器;
c.AFTER|BEFORE是触发的时机:

  • AFTER表示在触发事件的操作执行之后激活触发器;
  • BEFORE表示在触发事件的操作执行之前激活触发器。

⑦触发器类型

a.行级触发器(FOR EACH ROW)
b.语句级触发器(FOR EACH STATEMENT)

例如,在TEACHER表上创建一个AFTER UPDATE触发器,触发事件是UPDATE语句:

UPDATE TEACHER SET Deptno=5;
//假设表TEACHER有1000行
//如果是语句级触发器,name执行完该语句后,触发动作只发生一次;
//如果是行级触发器,触发动作将执行1000次。

⑧触发条件

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

⑨触发动作体

a.触发动作体可以是一个匿名PL/SQL过程块,也可以是对已创建存储过程的调用;
b.如果是行级触发器,用户都可以在过程体中使用NEW和OLD引用事件之后的新值和事件之间的旧值;
c.如果是语句级触发器,则不能在触发动作体中使用NEW或OLD进行引用;
d.如果触发动作体执行失败,激活触发器的事件就会终止执行,触发器的目标表或触发器可能影响的其他对象不发生任何变化。

注意:不同的RDBMS产品触发器语法各不相同。

⑩例子:当对表SC的Grade属性进行修改时,若分数增加了10%,则将此次操作记录到下面表中:SC_U(Sno,Cno,Oldgrade,Newgrade)

CREATE TRIGGER SC_T
AFTER UPDATE OF Grade ON SC
REFERENCES
	OLD ROW AS OldTuple,
	NEW ROW AS NewTuple
FOR EACH ROW 
WHEN(NewTuple.Grade>=1.1*OldTuple.Grade)
	INSERT INTO SC_U(Sno,Cno,OldGrade,NewGrade)
	VALUES(OldTuple.Sno,OldTuple.Cno,OldTuple.Grade,NewTuple.Grade)

⑪例子:将每次对表Student的插入操作所增加的学生个数记录到表StudentInsertLog中:

CREATE TRIGGER Student_Count
AFTER INSERT ON Student   //指明触发器激活的时间是在执行INSERT之后
REFERENCES
	NEWTABLE AS DELTA
FOR EACH STATEMENT   //语句级触发器,即执行完INSERT语句后下面的触发动作体才执行一次
	INSERT INTO StudentInsertLog(Numbers)
	SELECT COUNT(*) FROM DELTA

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

CREATE TRIGGER Insert_Or_Update_Sal
BEFORE INSERT OR UPDATE ON TEACHER
FOR EACH ROW
BEGIN     //定义触发动作体,是PL/SQL过程块
	IF(new.Job='教授') AND (new.Sal<4000)
	THEN new.Sal:=4000;
	END IF;
END;

2.激活触发器

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

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

a.执行该表上的BEFORE触发器;
b.激活触发器的SQL语句;
c.执行该表上的AFTER触发器。

3.删除触发器

①删除触发器的SQL语法:

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

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

最后

以上就是平淡哑铃为你收集整理的数据库完整性一.实体完整性二.参照完整性三.用户定义的完整性四.完整性约束命名子句五.断言六.触发器的全部内容,希望文章能够帮你解决数据库完整性一.实体完整性二.参照完整性三.用户定义的完整性四.完整性约束命名子句五.断言六.触发器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部