一、数据库完整性基础

1. 核心定义:完整性 = 正确性 + 相容性

维度 含义 示例
数据正确性 符合现实语义、反映实际状况 国内性别仅 “男 / 女”,国外可能有其他选项
数据相容性 同一对象在不同表中数据一致 同一个人不能有两个不同身份证号

2. 完整性 vs 安全性(易混淆点)

对比项 数据库完整性 数据库安全性
核心目标 防止不合语义的不正确数据 防止恶意破坏和非法存取
防范对象 错误数据 非法用户、非法操作

3. DBMS 维护完整性的 3 大机制

  1. 定义约束条件:用 SQL 的 DDL 语句定义(实体完整性、参照完整性、用户自定义完整性),存入数据字典
  2. 检查约束:执行INSERT/DELETE/UPDATE后或事务提交时自动检查
  3. 违约处理:拒绝操作、级联执行操作等(类似 “违纪处理”)

二、三大核心完整性约束

1. 实体完整性(主键约束)

(1)定义:用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)
      );
      
    • 表级定义示例:
      CREATE TABLE Student (
          Sno CHAR(9),
          Sname CHAR(20) NOT NULL,
          Ssex CHAR(2),
          Sage SMALLINT,
          Sdept CHAR(20),
          PRIMARY KEY (Sno)  -- 表级指定主键
      );
      
  • 多属性联合主键:仅能表级定义(如 SC 表,Sno+Cno 为主键):
    CREATE TABLE SC (
        Sno CHAR(9) NOT NULL,
        Cno CHAR(4) NOT NULL,
        Grade SMALLINT,
        PRIMARY KEY (Sno, Cno)  -- 联合主键,表级定义
    );
    
(2)检查与违约处理
  • 检查时机:INSERT新记录或UPDATE主键列时
  • 检查内容:① 主键值是否唯一(重复则拒绝操作)② 主键各属性是否为空(任一为空则拒绝操作)

2. 参照完整性(外键约束)

(1)定义:用FOREIGN KEY...REFERENCES指定外键(参照其他表的主键,保证数据一致性)
  • 示例(SC 表的 Sno 参照 Student 表的 Sno,Cno 参照 Course 表的 Cno):
    CREATE TABLE SC (
        Sno CHAR(9) NOT NULL,
        Cno CHAR(4) NOT NULL,
        Grade SMALLINT,
        PRIMARY KEY (Sno, Cno),  -- 实体完整性
        -- 参照完整性:Sno外键,参照Student的Sno
        FOREIGN KEY (Sno) REFERENCES Student(Sno),
        -- 参照完整性:Cno外键,参照Course的Cno
        FOREIGN KEY (Cno) REFERENCES Course(Cno)
    );
    
(2)检查与违约处理(3 种策略)
被参照表操作(如 Student) 参照表影响(如 SC) 违约处理策略
- 插入 / 修改外码值 拒绝(默认,外码无对应主键则不允许)
删除元组 参照表有依赖记录 ① 拒绝(默认);② 级联删除(删除被参照表记录时,删除参照表依赖记录);③ 设置为空(外码允许空时,将依赖记录的外码设为空)
修改主码值 参照表有依赖记录 ① 拒绝(默认);② 级联修改(修改被参照表主码时,同步修改参照表外码);③ 设置为空(外码允许空时,将依赖记录的外码设为空)
  • 显式指定策略示例(SC 表,Sno 级联删改,Cno 删除拒绝、更新级联):
    CREATE TABLE SC (
        Sno CHAR(9) NOT NULL,
        Cno CHAR(4) NOT NULL,
        Grade SMALLINT,
        PRIMARY KEY (Sno, Cno),
        -- Sno:删除/更新时级联处理
        FOREIGN KEY (Sno) REFERENCES Student(Sno)
            ON DELETE CASCADE 
            ON UPDATE CASCADE,
        -- Cno:删除时拒绝,更新时级联
        FOREIGN KEY (Cno) REFERENCES Course(Cno)
            ON DELETE NO ACTION 
            ON UPDATE CASCADE
    );
    

3. 用户定义的完整性(自定义语义约束)

(1)属性级约束(针对单个属性的规则)
约束类型 关键字 / 短语 示例
非空 NOT NULL SC 表的 Sno、Cno、Grade 非空:Sno CHAR(9) NOT NULL
唯一 UNIQUE DEPT 表的 Dname 唯一:Dname CHAR(9) UNIQUE
取值范围 CHECK(条件) Student 表 Ssex 仅 “男 / 女”:Ssex CHAR(2) CHECK (Ssex IN ('男','女'));SC 表 Grade 0-100:Grade SMALLINT CHECK (Grade>=0 AND Grade<=100)
缺省值 DEFAULT Student 表 Sage 默认 18:Sage SMALLINT DEFAULT 18;Orders 表 OrderDate 默认当前时间:OrderDate date DEFAULT GETDATE()
(2)元组级约束(多个属性间的关联规则,用CHECK
  • 示例:学生性别为 “男” 时,姓名不能以 “Ms.” 开头:
    CREATE TABLE Student (
        Sno CHAR(9) PRIMARY KEY,
        Sname CHAR(8) NOT NULL,
        Ssex CHAR(2),
        Sage SMALLINT,
        Sdept CHAR(20),
        -- 元组约束:Ssex和Sname关联
        CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%')
    );
    
(3)检查与违约处理
  • 时机:INSERTUPDATE
  • 处理:不满足约束则拒绝操作

三、完整性约束命名字句(CONSTRAINT

1. 作用:给约束命名,方便后续修改 / 删除(灵活管理约束)

2. 语法:CONSTRAINT <约束名> [PRIMARY KEY/FOREIGN KEY/CHECK/UNIQUE/NOT NULL]

3. 示例(Student 表,命名 5 个约束):

CREATE TABLE Student (
    -- C1:学号90000~99999
    Sno NUMERIC(6) CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),
    -- C2:姓名非空
    Sname CHAR(20) CONSTRAINT C2 NOT NULL,
    -- C3:年龄<30
    Sage NUMERIC(3) CONSTRAINT C3 CHECK (Sage < 30),
    -- C4:性别仅男/女
    Ssex CHAR(2) CONSTRAINT C4 CHECK (Ssex IN ('男','女')),
    -- StudentKey:主键约束
    CONSTRAINT StudentKey PRIMARY KEY(Sno)
);

4. 约束的修改与删除(用ALTER TABLE

  • 删除约束:ALTER TABLE <表名> DROP CONSTRAINT <约束名>示例:删除 Student 表的 C4(性别约束):
    ALTER TABLE Student DROP CONSTRAINT C4;
    
  • 修改约束:先删除旧约束,再新增新约束示例:学号范围改为 900000~999999,年龄改为 < 40:
    -- 删除旧C1(学号约束)
    ALTER TABLE Student DROP CONSTRAINT C1;
    -- 新增C1(新学号约束)
    ALTER TABLE Student ADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000 AND 999999);
    -- 删除旧C3(年龄约束)
    ALTER TABLE Student DROP CONSTRAINT C3;
    -- 新增C3(新年龄约束)
    ALTER TABLE Student ADD CONSTRAINT C3 CHECK (Sage < 40);
    

四、小结

  1. 核心目标:保证数据库中数据正确、一致(区别于安全性的 “防非法操作”)
  2. 三大约束体系:
    • 实体完整性:主键(非空唯一)
    • 参照完整性:外键(参照主键,级联 / 拒绝 / 设空处理)
    • 用户定义完整性:属性 / 元组级自定义规则(非空、唯一、取值范围等)
  3. 管理工具:CONSTRAINT命名约束,ALTER TABLE修改 / 删除约束
  4. DBMS 机制:定义约束→检查约束→违约处理(闭环保障完整性)
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐