数据库完整性
数据库的完整性是指数据的正确性和相容性。正确性指的是符合现实世界的语义l反映了当前实际状况的,相容性指同一个对象在不同的关系里面是符合逻辑的。例如:性别只能是男的或者女的,学生的选修课必须是本校的开设课程,学生的学号必须唯一等。数据的完整性是为了防止数据库中存在不符合语义的句子。
为了维护数据库的完整性,数据库管理系统必须能够实现以下功能:
- 提供定义完整性约束条件机制
- 提供完整性检查的方法
- 进行违约处理
实体完整性
1.定义实体完整性
关系模型中的实体完整性在CREATE TABLE中用PRIMARY KEY定义,有两种定义方法,列级约束条件、表级约束条件。
列级约束条件:
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEy,/*在列级定义主码。*/
Sname CHAR(20)NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
表级约束条件(定义多个码时只能用表级约束条件):
CREATE TABLE Student
(Sno CHAR(9) ,
Sname CHAR(20)NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEy(sno)
);
2.实体完整性检查和违约处理
当PRIMARY KEY定义了主码以后当用户对表中的数据进行修改的时候,列如插入删除更新时,数据库管理系统会对实体完整性进行如下检查:
+ 检查主码是否唯一
+ 检查主码的属性是否为空,为空则拒绝插入或者修改。
参照完整性
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.参照完整性的检查和违约处理
参照完整性将两个表联系起来了,当对参照表和被参照表进行增删改的时候,可能会破坏参照完整性。,所以需要进行参照完整性的检查。以下可能会破坏参照完整性
参照完整性的违约处理
-
拒绝执行(NO ACTION)
-
级联操作(CASCADE)
当删除或修改被参照表(Student)的一个元组造成了与参照表(SC)的不一致,则删除或修改参照表中的所有造成不一致的元组。
-
设为空值
l当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空值。
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 /*级联删除SC表中相应的元组*/
ON UPDATE CASCADE, /*级联更新SC表中相应的元组*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
ON DELETE NO ACTION
/*当删除course 表中的元组造成了与SC表不一致时拒绝删除*/
ON UPDATE CASCADE
/*当更新course表中的cno时,级联更新SC表中相应的元组*/
);
3.用户定义的完整性
属性上的约束条件
在创建表的时候,可以定义属性上的约束条件,包括:
- 列值非空(NOT NULL)、
- 列值唯一(UNIQUE)
- 检查列值是否满足一个条件表达式(CHECk)
CREATE TABLE DEPT
( Deptno NUMERIC(2),
Dname CHAR(9) UNIQUE NOT NULL,
/*要求Dname列值唯一, 并且不能取空值*/
Location CHAR(10),
PRIMARY KEY (Deptno)
);
CREATE TABLE Student
( Sno CHAR(9) PRIMARY KEY,
Sname CHAR(8) NOT NULL,
Ssex CHAR(2) CHECK (Ssex IN (‘男’,’女’)),
/*性别属性Ssex只允许取'男'或'女' */
Sage SMALLINT,
Sdept CHAR(20)
);
元组上的约束条件
在CREATE TABLE语句中可以用CHECK短语定义元组上的约束条件,是元组级的限制
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两个属性值之间的约束条件*/
);