0. 概述
-
什么是数据库的完整性?
数据库的完整性是指数据的正确性和相容性。数据的正确性是值数据是符合现实世界语义、反映当前实际状况的;数据的相容性是指数据库同一对象在不同关系表中的数据是符合逻辑的。 -
DBMS 的完整性控制机制应具有哪三个方面的功能?
a. 定义功能;
b. 检查功能;
c. 违约处理功能。 -
定义数据库完整性一般由 SQL 的 _____ 语句实现的?
DDL(数据库模式定义语言)
1. 实体完整性
- 如何在 SQL 中定义实体完整性?
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY, // 在列级定义主码
/*...*/
);
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(9) NOT NULL,
/*...*/
PRIMARY KEY (Sno, Cno) // 属性组只能在表级定义主码
);
2. 参照完整性
- 如何在 SQL 中定义参照完整性?
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(9) NOT NULL,
/*...*/
PRIMARY KEY (Sno, Cno),
FOREIGN KEY (Sno) REFERENCES Student(Sno), // 在表级定义参照完整性
FOREIGN KEY (Cno) REFERENCES Course(Cno)
);
注意:
- 定义参照完整性的时候注意定义的顺序,被参照表要先被定义。
3. 用户定义的完整性
- 定义属性上的约束条件。
属性值的限制有三种:列值非空(NOT NULL
),列值唯一(UNIQUE
),检查列值是否满足一个条件表达式(CHECK
短语)。
CREATE TABLE Student
(Sno CHAR(9) NOT NULL,
Dname CHAR(9) UNIQUE NOT NULL, // 唯一且不能取空值
// 性别只允许取'男'或'女'
Ssex CHAR(2) CHECK(Ssex IN ('男','女')),
// 限定成绩的取值范围
Grade SMALLINT CHECK(Grade >= 0 AND Grade <= 100),
/*...*/
);
- 定义元组上的约束条件。
// 例:学生性别是男时,其名字不能以 Ms. 打头
CREATE TABLE Student
(Sno CHAR(9),
Sname CHAR(8) NOT NULL,
Ssex CHAR(2),
/*...*/
// 定义两个属性值之间的约束条件
CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%')
);
4. 完整性约束命名子句
-
定义完整性约束命名子句。
CONSTRAINT <完整性约束条件名> <完整性约束条件>
其中<完整性约束条件>
包括NOT NULL
、UNIQUE
、PRIMARY KEY
、FOREIGN KEY
、CHECK
短语等。 -
修改表中的完整性约束子句。
a. 去掉某个完整性约束子句:
ALTER TABLE <表名> DROP CONSTRAINT <完整性约束条件名>;
b. 增加新的完整性约束子句:
ALTER TABLE <表名> ADD CONSTRAINT <完整性约束条件名> <完整性约束条件>;
5. 域中的完整性限制
- 定义域,建立并修改该域应该满足的完整性约束条件。
// 例:建立域的同时声明取值范围
CREATE DOMAIN GenderDomain CHAR(2)
CHECK (VALUE IN ('男','女'));
// 例:建立域的同时对其中的限制命名
CREATE DOMAIN GenderDomain CHAR(2)
CONSTRAINT GD CHECK (VALUE IN ('男','女'));
// 删除限制条件
ALTER DOMAIN GenderDomain
DROP CONSTRAINT GD;
// 增加限制条件
ALTER DOMAIN GenderDomain
ADD CONSTRAINT GDD CHECK (VALUE IN ('1','0'));
6. 断言
- 定义断言的格式?
CREATE ASSERTION <断言名> <CHECK 子句>;
其中<CHECK 子句>
中的约束条件与WHERE
子句的条件表达式类似。
// 例:限制每一门课程最多 60 名学生选修
CREATE ASSERTION ASSE_SC_CNUM1
CHECK(60 >= ALL(SELECT count(*)
FROM SC
GROUP BY cno)
);
- 删除断言的格式?
DROP ASSERTION <断言名>;