数据库的完整性

DBMS数据控制功能:完整性,安全性,数据库恢复,并发控制
数据库的完整性,通过过对数据库中的数据进行语义定义来实现
语义完整性和事务完整性,事务完整性包括并发控制和恢复技术,语义完整性是指数据库中的数据必须始终满足语义约束
数据库的安全性
保护数据库,防止数据库中的数据被破坏和存取
数据库的完整性
包括了数据的正确性和数据的相容性
数据的正确性:是指数据是符合现实世界语义的
数据的相容性:是指数据库同一对象在不同关系表中的数据是符合逻辑的,即不同数数据对象是有着符合逻辑的关系
为维护数据库的完整性,数据库管理系统必须:
1.提供定义完整性约束条件的机制
完整性约束条件也叫做完整性规,是一种语义约束条件,包括了实体完整性、参照完整性、用户定义完整性
2.提供完整性检查的方法
3.违约处理
拒绝(NO ACTION)执行该操作
级连(CASCADE)执行其他操作
实体完整性定义
关系模型的实体完整性
CREATE TABLE中用PRIMARY KEY定义
单属性构成的码有两种说明方法
定义为列级约束条件、定义为表级约束条件
对多个属性构成的码只有一种说明方法
定义为表级约束条件
实体完整性检查和违约处理
对主码列进行插入或更新操作时,RDBMS按照实体 完整性规则自动进行检查
1. 检查主码值是否唯一,如果不唯一则拒绝插 入或修改
2. 检查主码的各个属性是否为空,只要有一个 为空就拒绝插入或修改
参照完整性的定义
关系模型的参照完整性定义
在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码
用REFERENCES短语指明这些外码参照哪些表的主码
参照完整性检查和违约处理
①参照表插入元组可能破坏被参照表的参照完整性,因此拒绝处理
②参照表修改外码的值可能破坏被参照表的参照完整性,因此拒绝操作
③被参照表删除元组可能破坏参照表的参照完整性,因此拒绝/级连删除/设置为空值
④被参照表修改主码值可能破坏参照表的参照完整性,因此拒绝/级连修改/设置为空值
违约处理
参照完整性违约处理
1. 拒绝(NO ACTION)执行,默认策略
2. 级联(CASCADE)操作 ,需要进行一系列相关操作,保证数据的一致性
3. 设置为空值(SET-NULL),对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值
约束条件的定义
CREATE TABLE时定义
列值非空(NOT NULL)
列值唯一(UNIQUE)
检查列值是否满足一个布尔表达式(CHECK)
约束条件检查和违约处理
插入元组或修改属性的值时,RDBMS检查属性上的约束条件是否被满足
如果不满足则操作被拒绝执行
完整性约束命名子句
CONSTRAINT—对完整性约束条件命名
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)
);
在Student表上建立了5个约束条件,包括主码约束(命名为StudentKey)以及C1、C2、C3、C4四个列级约束

修改表中的完整性限制
使用ALTER TABLE语句修改表中的完整性限制
ALTER TABLE 表名
DROP CONSTRAINT 已定义的约束;
ALTER TABLE 表名
ADD CONSTRAINT定义一个新的约束条件;

例 修改表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);

域中的完整性限制
域是一组具有相同数据类型的值的集合
如:性别的取值范围是{’男’,’女’}
用CREATE DOMAIN语句建立一个域以及该域应该满足的完整性约束条件

例 建立一个性别域GenderDomain,并对约束命名
CREATE DOMAIN GenderDomain CHAR(2)
CONSTRAINT GD CHECK ( VALUE IN ('男''女') );

断言
可以定义涉及多个表的或聚集操作的比较复杂的完 整性约束

例 限制数据库课程最多60名学生选修 
CREATE ASSERTION ASSE_SC_DB_NUM
CHECK (60 >= (select count(*) 
                          From Course,SC
                          Where SC.Cno=Course.Cno and
                          Course.Cname ='数据库') )
例 一个电影资料库假定有3个基本表:电影表Movie、演员表Actor和电影主演表Acts。其中Movie的属性包括电影名(Title)、制作年份(Year)、长度(Length)、颜色 (isColor)等;Actor属性包括演员名(Name)、地址 (Address)、性别(Sex)、出生年份(BirthYear)等;Acts 包括电影名(movieTitle)、制作年份(MovieYear)、演员 姓名(ActorName)等
写出创建上述三个表的SQL语句,要求: 
①有主键、外键约束及相关完整性约束 
②电影表中的年份不能在1895年以前 
③电影长度不能短于60分钟,也不能长于240分钟 
④1939年以前制作的电影不会是彩色的 
⑤演员不会出现在他们出生之前的电影中
CREATE TABLE Movie(
Title CHAR(30),
Year INT CHECK(Year>=1895),
Length INT CHECK(Length>=60 AND Length<=240),
isColor CHAR(3) CHECK(isColor in(‘YES’,’NO’)),
PRIMARY KEY(Title,Year),
CHECK(isColor=’NOOR Year>=1939));
CREATE TABLE Actor(
Name CHAR(20) PRIMARY KEY,
Address VARCHAR(30),
Sex CHAR(6) CHECK(Sex in (‘male’,female’)),
BirthYear INT,
CHECK(Name NOT IN(SELECT ActorName FROM Acts) OR 
BirthYear<ALL(SELECT MovieYear FROM Acts WHERE ActorName=Name))
);
CREATE TABLE Acts(
MovieTitle CHAR(30),
MovieYear INT,
ActorName CHAR(20),
PRIMARY KEY (MovieTitle,MovieYear,ActorName),
FOREIGN KEY (MovieTitle,MovieYear) REFERENCES Movie(Title,Year),
FOREIGN KEY(ActorName) REFERENCES Actor(Name),
CHECK (MovieYear>(SELECT BirthYear FROM Actor
WHERE Name=ActorName))
);

猜你喜欢

转载自blog.csdn.net/FZUMRWANG/article/details/79914054