# 前言

以此篇记录数据库系统概述的第五章,数据库完整性的学习

数据库的完整性是指数据的 正确性相容性 ,为了维护数据库的完整性,数据库管理系统需要实现如下功能

  1. 提供定义完整性约束条件的机制
  2. 提供完整性检查的方法
  3. 进行违约处理

# 实体完整性

# 实体完整性定义

  • 关系模型的实体完整性
    • create table 中用 PRIMARY KEY 定义
  • 单属性构成的码有两种说明方法
    • 定义为列级约束条件
    • 定义为表级约束条件
  • 对多个属性构成的码只有一种说明方法
    • 定义为表级约束条件

将Student表中的Sno属性定义为码

create table Student (
    Sno char(9) PRIMARY KEY,
    Sname char(20) NOT NULL,
    Ssex char(2),
    Sage smallint,
    Sdept char(20)
);

将SC表中的Sno、Cno属性组定义为码

create table SC (
    Sno char(9) NOT null,
    Cno char(4) not null,
    Grade smallint,
    primary key (Sno,Cno)
);

# 实体完整性检查和违约处理

插入或对主码进行更行操作时,RDBMS 按照实体完整性规则进行检查(通过 全表扫描 的方式进行):

  • 检查主码是否唯一
  • 检查主码的各个属性是否为空

# 参照完整性

  • 在 create table 中用 foreign key 短语定义哪些列为外码
  • 用 references 短语指明这些外码参照哪些表的主码

参照完整性的违约处理

  • 拒绝执行(默认)
  • 级联操作
  • 设置为空值

# 用户自定义完整性

用户定义的完整性是针对某一个具体应用的数据必须满足的语义要去,由 RDBMS 提供,而不必由应用程序承担

# 属性上的约束条件

CREATE TABLE 语句中:

  • 列值非空(NOT NULL)

  • 列值唯一(unique)

    创建部门表DEPT,要去部门名称Dname列取唯一值,部门编号Deptno列为主码

    create table DEPT (
        Deptno char(10) primary key,
        Dname char(10) unique
    );
  • 检查列值是否满足一个布尔表达式(CHAECK)

    用check短语指定列值应该满足的条件,Student表的Ssex只允许取男或女

    create table Student(
        Sno char(20) primary key,
        Sname char(10) not null,
        Ssex cahr(2) check(Ssex IN('男','女'))
        Sage smallint
        Sdept cahr(2)
    );

注:属性上的约束条件检查和违约处理

插入元组或者修改属性时,RDBMS 检查属性上的约束条件是否被满足,如果不满足则被拒绝执行

# 元组上的约束条件的定义

与同属性值限制相比,元组级的限制可以设置 不同属性 之间的取值的相互约束条件

当学生的性别是男的时候,其名字不能以Ms. 开头

create table Student (
    Sname char(9) NOT null,
    Sno char(10),
    Ssex char(2),
    primary key(Sno),
    check(Ssex='女' or not like 'Ms.')
);

修改需要使用 ALTER TABLE 语句修改表中的完整性限制,修改时需要先删除原来的约束条件,再增加新的约束条件