【MySQL】MySQL外键和级联删除


就在启程的时刻

让我为你唱首歌

不知以后你能否再见到我

等到相遇的时刻

我们再唱这首歌

就像我们从未曾离别过

🎵 水木年华《启程》


在数据库设计中,外键和级联删除是两个非常重要的概念,它们有助于保持数据的完整性和一致性。今天我们将详细探讨 MySQL 中外键的使用及其与级联删除的关系,并通过一个具体的例子来说明这些概念。

什么是外键?

外键是一个表中的字段,它是另一个表的主键的引用。外键用于建立两个表之间的关系,确保数据的参照完整性。这意味着如果表 A 中的某个字段是表 B 中某个字段的外键,则表 A 的该字段值必须在表 B 的相应字段中存在。

级联删除(CASCADE DELETE)

级联删除是一种数据库管理策略,用于定义当父记录(主表中的记录)被删除时如何处理子记录(外键表中的记录)。如果设置了级联删除,当删除主表中的记录时,所有依赖于该记录的子表中的记录也将被自动删除。这有助于避免数据不一致和孤立记录的问题。

示例

假设我们有两个表:Students 和 Enrollments。Students 表保存学生信息,Enrollments 表保存学生的课程注册信息。每个学生可以注册多个课程,因此 Students 表与 Enrollments 表之间存在一对多的关系。

  1. 创建 Students 表:

    sql 复制代码
    CREATE TABLE Students (
        StudentID INT AUTO_INCREMENT,
        Name VARCHAR(100),
        PRIMARY KEY (StudentID)
    );
  2. 创建 Enrollments 表:

    在这个表中,StudentID 字段是外键,它引用 Students 表的 StudentID 字段。

    sql 复制代码
    CREATE TABLE Enrollments (
        EnrollmentID INT AUTO_INCREMENT,
        CourseName VARCHAR(100),
        StudentID INT,
        PRIMARY KEY (EnrollmentID),
        FOREIGN KEY (StudentID) REFERENCES Students(StudentID)
            ON DELETE CASCADE
    );

    在这里,FOREIGN KEY (StudentID) REFERENCES Students(StudentID) ON DELETE CASCADE 表示 StudentID 是一个外键,它指向 Students 表的 StudentID。关键的部分是 ON DELETE CASCADE,这指定了当一个学生记录从 Students 表中删除时,该学生的所有注册信息(在 Enrollments 表中)也将自动删除。

测试级联删除

我们来测试一下级联删除的效果。

添加测试数据:

sql 复制代码
INSERT INTO Students (Name) VALUES ('Alice'), ('Bob');

-- 假设 Alice 的 StudentID 是 1,Bob 的是 2
INSERT INTO Enrollments (CourseName, StudentID) VALUES ('Math', 1), ('Science', 1), ('English', 2);

执行删除操作:

sql 复制代码
DELETE FROM Students WHERE Name = 'Alice';

这条删除命令将会删除所有名为 Alice 的学生记录。因为我们为 StudentID 设置了级联删除,所以与 Alice 相关的所有 Enrollments 记录(她注册的课程)也将被自动删除。

总结

使用外键和级联删除可以极大地简化数据库管理,尤其是在处理删除操作时。它们帮助自动维护数据的一致性和完整性,避免孤立记录的产生。在设计数据库时,合理利用这些工具不仅可以提升数据的质量,还可以优化数据管理流程。然而,也需谨慎使用级联删除,因为不恰当的使用可能导致大量数据的意外丢失。

相关推荐
小白男神2 天前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
这个DBA有点耶2 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G2 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备2 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远2 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
kybs19913 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
2601_962218613 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
程序猿_极客3 天前
【免费】分享一套优质的基于SSM的校园失物招领系统的设计与实现,源码+文档+视频详解(讲解)
java·mysql·ssm·课程设计·失物招领系统
张洛闻Eren3 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安3 天前
MySQL-触发器
数据库·mysql