数据库完整性定义:
数据库完整性指数据的正确性和相容性。
实体完整性
关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。对单属性构成的码有两种说明方法,一种是定义为列级约束条件,另一种是表级约束条件。对多属性构成的码只有一张说明方法,即定义表级约束条件。
单属性构成的码和多属性构成的码区别区别:
单属性构成的码是指表中的一个属性(列)或字段,通过该属性的取值可以唯一标识表中的每个元组(行)。而多属性构成的码则是由表中多个属性组合而成,通过这些属性的取值组合可以唯一标识表中的每个元组。
区别在于,单属性构成的码只需要一个属性就能唯一标识元组,而多属性构成的码需要多个属性的组合才能实现唯一标识。
例1 将Student表中的Sno属性定义为码
CREATE TABLE Student
( Sno CHAR(9) PRIMARY KEY, /*列级定义主码*/
Sname CHAR(20) NOT NULL
);
CREATE TABLE Student
( Sno CHAR(9),
Sname CHAR(20) NOT NULL;
PRIMARY KEY(Sno) /*表级定义主码*/
);
参照完整性
关系模型的参照完整性在CREATE TABLE中用FOREIGN KEY短语定义哪些列是外码,用REFERENCES短语指明这些外码参照哪些表的主码。
例如,关系SC中的一个元组表示一个学生选修的某门课程的成绩,(Sno,Cno)是主码。Sco,Cnod分别参照引用Student表的主码和Course表的主码。
定义SC中的参照完整性
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(9) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno,Cno), /*表级约束条件*/
FOREIGN KEY(Sno) REFERENCES Student(Sco),
FOREIGN KEY(Cno) REFERENCES Course(Cco),
);
用户定义的完整性
属性上的约束条件定义
在CREATE TABLE中定义属性的同时,可以根据应用要求定义属性上的约束条件,即属性值限制。包括:
列值非空(NOT NULL)
列值唯一(UNIQUE)
检查列值是否满足一个条件表达式(CHECK短语)
例1:建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码。
CREATE TABLE DEPT
(Deptno NUMERIC(2),
Dname CHAR(9) UNIQUE NOT NULL /*中间没有逗号*/
);
例2:Student表的Ssex只允许取"男"或"女"
CREATE TABLE Student
( Sno CHAR(9) PRIMARY KEY,
Sname CHAR(8) NOT NULL,
Ssex CHAR(2) CHECK(Ssex IN ('男','女')),
);
例3:SC表的Grade的值应该在0和100之间
CREATE TABLE SC
(Sno CHAR(9),
Grade SMALLINT CHECK(Grade>=0 AND Grade<=100)
);
属性上约束条件的检查和违约处理
当往表中插入元组或修改属性的值时,关系数据库管理系统将检查属性上的约束条件是否被满足,如果不满足则操作被拒绝执行。
元组上的约束条件定义
与属性上的约束条件定义类似,在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.%')
);
完整性约束命名句子
<完整性约束条件>包括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这4个列级约束。
修改表中完整性限制
去掉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);
断言
断言创建以后,任何对断言所涉及关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行。
例:限制数据库课程最多60名学生选修
CREATE ASSERTION ASSE_SC_DB_NUM
CHECK(60>=(SELECT count(*) FROM Course,SC
WHERE SC.CNO=COURSE.CNO AND COURSE.CNAME=‘数据库’)
)
每当学生选修课程时,将在SC表中插入一条元组(Sno,Cno,NULL),ASSE_SC_DB_NUM断言被触发检查.如果选修数据库课程的人数已经超过60人,CHECK子句返回值为"假",对SC表的插入操作被拒绝。
例 限制每一门课程最多60名学生选修
CREATE ASSERTION ASSE_SC_CNUMI
CHECK(60>=ALL(SELECT(*)
FROM SC
GROUP by cno
);
例 限制每个学期每一门课程最多60名学生选修
ALTER TABLE SC ADD TERM DATE;
CREATE ASSERTION ASSE_SC_CNUM2
CHECK(60>=(select count(*) from SC group by cno,TERM));