数据库完整性
- 数据的准确性:for:学生的学号必须唯一
- 数据的相容性:是指数据库同一对象在不同关系表中的数据是符合逻辑的
- for: 生所选的课程必须是学校开设的课程
- 数据的完整性和安全性是两个不同概念
- 完整性是防止合法用户误操作
- 安全性是防止非法用户非法数据
- 如何保护数据库的完整性:
- 提供定义完整性约束条件(完整性规则)的机制
- DDL 语句来定义,由DBMS 将其存入数据字典
- 提供完整性检查机制:一般在数据操纵之后
- 违约处理
- 拒绝(NO ACTION)执行该操作
- 级连(CASCADE)执行其他操作
- 提供定义完整性约束条件(完整性规则)的机制
- 由DBMS进行完整性检查
实体完整性
CREATE TABLE中用PRIMARY KEY定义(主码定义)
- 插入或对主码列进行更新操作时,DBMS按照实体完整性规则自动进行检查。
- 检查主码值是否唯一
- 检查主码的各个属性是否为空
- 为避免对基本表进行全表扫描,RDBMS核心一 般都在主码上自动建立一个索引
- 例子:B+树
- 单属性构成的码
- 定义为列级约束条件
- 定义为表级约束条件
- 多个属性构成的码
- 定义为表级约束条件
[例5.1] 将Student表中的Sno属性定义为码
(1)在列级定义主码
CREATE TABLE Student(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
(2)在表级定义主码
CREATE TABLE Student(Sno CHAR(9),
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY (Sno)
);
[例5.2] 将SC表中的Sno,Cno属性组定义为码
CREATE TABLE SC(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno,Cno)/*只能在表级定义主码*/
);
参照完整性
若属性(或属性组)F是基本关系R的外码它与基本关系S的 主码
相对应(基本关系R和S不一定是不同的关系),则 对于R中每个元组在F上的值必须为:
- 或者取空值(F的每个属性值均为空值)
- 或者等于S中某个元组的主码值
例:学生关系的“专业号”是外码,它参照专业关系的主码“专业号”
学生关系中每个元组的“专业号”属性只取两类值:
(1)空值,表示该学生尚未确定专业
(2)非空值, 这时该值必须是专业关系中某个元组的“专业号”值,表 示该学生不可能属于一个不存在的专业 <