外码(Foreign Key)可以与主码(Primary Key)不同名,但在实际应用中通常同名以增强可读性和识别性

一、关系数据库的完整性规则

  1. 参照完整性规则

    • 外码(Foreign Key)可以与主码(Primary Key)不同名,但在实际应用中通常同名以增强可读性和识别性。
    • 外码属性的取值必须满足以下两类之一:
      • 空值(NULL),表示尚未分配或无关联;
      • 必须是被参照关系中某个元组的主码实际存在的值,禁止引用不存在的主码值。
    • 对于由多个属性构成的主键(如“学号+课程号”组成的连接关系),这些主属性不仅需满足实体完整性(即不能取空值),还必须满足参照完整性,因此只能取被参照表中存在的组合主码值。
    • 在同一关系内部存在自参照时(例如“学生”关系中的“班长”属性指向本表的“学号”),其值可为空(表示暂无班长),或为本关系中某一元组的有效主码值。
  2. 用户定义的完整性规则

    • 根据具体应用场景设定的语义约束,如:
      • 属性唯一性(UNIQUE);
      • 取值范围限制(如成绩在0~200之间);
      • 是否允许空值(NOT NULL)。
    • 这些规则也称为“域完整性规则”,用于限定属性的取值类型、格式、范围及约束条件。
    • 包括两种类型的取值范围:
      • 静态约束:固定值集合(如性别只能为‘男’或‘女’);
      • 动态约束:依赖于其他属性或其他记录的状态(如入学年份不得晚于当前年份)。
  3. 操作时的完整性检查

    • 插入操作:依次检查三项完整性:
      1. 实体完整性(主键非空且唯一);
      2. 参照完整性(外键合法);
      3. 用户定义完整性(符合自定义约束)。
        若任一项不满足,则拒绝插入,或对不符合的外键设为空(若允许)。
    • 删除操作:当试图删除一个被外码引用的主码记录时,DBMS 提供多种处理策略:
      1. 拒绝删除(RESTRICT)—— 默认方式,防止破坏参照完整性;
      2. 置空删除(SET NULL)—— 将引用该主码的外码字段设为空;
      3. 级联删除(CASCADE)—— 同时删除所有引用此主码的相关记录。
    • 更新操作:逻辑上等价于“先删除旧值 + 再插入新值”。
      因此需要同时满足删除和插入的完整性检查规则,尤其是对外码引用的影响要进行完整评估。

二、SQL 语言简介

  • SQL(Structured Query Language,结构化查询语言)是用于关系数据库的标准语言,具备以下四大功能集成:

    • 数据定义(DDL:Data Definition Language)—— 创建、修改、删除数据库对象(如表、索引、视图);
    • 数据操纵(DML:Data Manipulation Language)—— 查询、插入、更新、删除数据;
    • 数据控制(DCL:Data Control Language)—— 权限管理(GRANT、REVOKE);
    • 事务控制(TCL:Transaction Control Language)—— COMMIT、ROLLBACK 等。
  • 核心特点为“综合统一”:

    • 一套语言即可完成数据库全生命周期的操作,无需切换工具或语法体系;
    • 支持从创建数据库模式(CREATE SCHEMA)、建表(CREATE TABLE)、授权(GRANT)、查询(SELECT)、到维护数据一致性的完整流程。
-- 示例:创建学生表并定义完整性约束
CREATE TABLE Student (
    学号 CHAR(10) PRIMARY KEY,
    姓名 VARCHAR(20) NOT NULL,
    专业号 CHAR(6),
    班长 CHAR(10),
    FOREIGN KEY (专业号) REFERENCES Major(专业号),
    FOREIGN KEY (班长) REFERENCES Student(学号)
        ON DELETE SET NULL
        ON UPDATE CASCADE
);

-- 插入数据时需满足所有完整性规则
INSERT INTO Student (学号, 姓名, 专业号, 班长)
VALUES ('20230001', '张三', 'CS01', '20230002'); -- 要求'CS01'在Major中存在,'20230002'是已有学生

在 SQL 中,级联删除(CASCADE DELETE)级联更新(CASCADE UPDATE) 是通过外键约束中的 ON DELETE CASCADEON UPDATE CASCADE 子句实现的。它们用于维护参照完整性的同时,自动传播对被引用记录的操作到依赖记录。

一、语法实现

CREATE TABLE 父表 (
    主码 INT PRIMARY KEY,
    数据 VARCHAR(50)
);

CREATE TABLE 子表 (
    ID INT PRIMARY KEY,
    外码 INT,
    FOREIGN KEY (外码) REFERENCES 父表(主码)
        ON DELETE CASCADE   -- 删除父表记录时,自动删除子表相关记录
        ON UPDATE CASCADE   -- 更新父表主码时,自动更新子表外码值
);

⚠️ 注意:主码一般不应被更新,但在支持的情况下(如使用代理键或业务键变更),ON UPDATE CASCADE 可确保数据一致性。


二、示例说明

假设有一个“部门-员工”关系:

-- 部门表(主表)
CREATE TABLE Department (
    DeptID CHAR(3) PRIMARY KEY,
    DeptName VARCHAR(20) NOT NULL
);

-- 员工表(从表),外键指向 Department
CREATE TABLE Employee (
    EmpID INT PRIMARY KEY,
    Name VARCHAR(30),
    DeptID CHAR(3),
    FOREIGN KEY (DeptID) REFERENCES Department(DeptID)
        ON DELETE CASCADE
        ON UPDATE CASCADE
);
场景1:级联删除
DELETE FROM Department WHERE DeptID = 'D01';

→ 所有 DeptID = 'D01' 的员工记录也会被自动删除。

场景2:级联更新
UPDATE Department SET DeptID = 'D99' WHERE DeptID = 'D01';

→ 所有原 DeptID = 'D01' 的员工记录的 DeptID 自动更新为 'D99'


三、适用场景

场景描述
1. 层次化数据结构如组织架构中“部门 → 员工”,删除一个部门时,其下属员工也应一并清理或重新分配(若允许级联则直接删除)。
2. 主从表关系(如订单与订单项)删除“订单”时,其所有“订单明细”应自动删除,避免产生孤立记录。
3. 逻辑主键变更需求当业务主键(非自增ID)可能更改时(如项目编号调整),使用 ON UPDATE CASCADE 可保持引用一致。
4. 临时/附属数据管理如用户上传的文件、日志等,当用户被删除时,相关资源记录可随之一同清除。

四、注意事项

  • 优点:简化应用逻辑,保障数据一致性。
  • 风险:误删主记录可能导致大量关联数据被连带删除,造成不可逆损失。
  • 🔐 建议
    • 在关键系统中谨慎使用 CASCADE
    • 可结合触发器或应用程序层控制提供确认机制;
    • 使用前充分评估数据依赖关系。

五、不同 DBMS 支持情况

数据库是否支持 ON DELETE CASCADE是否支持 ON UPDATE CASCADE
MySQL
PostgreSQL
SQL Server
Oracle
SQLite✅(需启用外键)

SQLite 默认关闭外键支持,需执行:

PRAGMA foreign_keys = ON;

在这里插入图片描述

一、关系数据库的完整性规则 参照完整性规则 外码同名实际应用中常同名以便识别。 外码属性(如 “专业号”)仅能取两类值:空值(未分配)、参照关系中已存在的值(可取存在的值)。 连接关系(如 “学号”“课程号”)的属性需同时满足实体完整性(可取空值)参照完整性,故只能取参照关系中已存在的值。 同一关系内的参照(如 “班长” 属性),值可为空(未选班长)或本关系中已存在的值(某学生学号)。 用户定义的完整性规则 基于具体应用语义的约束(如属性唯一、取值范围 0-200 等),由 DBMS 提供定义检验机制。 也称为 “域完整性规则”,限定属性的取值类型、范围、是否允许空值等,包括静态(固定值集合)动态(依赖其他属性)两种取值范围。 操作时的完整性检查 插入:依次检查实体完整性、参照完整性、用户定义完整性,满足则禁止插入(或调整外码为空)。 删除:若被参照,可选择拒绝删除、空值删除(外码设为空)、级联删除(关联记录一同删除)。 更新:等效于 “删除旧记录 + 插入新记录”,需同时满足删除插入的完整性规则。 二、SQL 语言简介 SQL(结构化查询语言)集数据查询、操纵、定义、控制功能于一体,是关系数据库的标准语言。 核心特点是 “综合统一”:包含数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL),可独立完成数据库生命周期的全部操作(定义模式、建立数据库等)。
12-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bol5261

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值