【MySQL】MySQL外键和级联删除


就在启程的时刻
让我为你唱首歌
不知以后你能否再见到我
等到相遇的时刻
我们再唱这首歌
就像我们从未曾离别过
                     🎵 水木年华《启程》


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

什么是外键?

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

级联删除(CASCADE DELETE)

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

示例

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

  1. 创建 Students 表:

    CREATE TABLE Students (StudentID INT AUTO_INCREMENT,Name VARCHAR(100),PRIMARY KEY (StudentID)
    );
    
  2. 创建 Enrollments 表:
    在这个表中,StudentID 字段是外键,它引用 Students 表的 StudentID 字段。

    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 表中)也将自动删除。

测试级联删除

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

添加测试数据:

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

执行删除操作:

DELETE FROM Students WHERE Name = 'Alice';

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

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/11521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32——TIMER(定时器)篇

技术笔记! 1. 定时器概述(了解) 1.1 软件定时器原理 使用纯软件(CPU死等)的方式实现定时(延时)功能 缺点:1. 延时不准确 2. CPU死等。 1.2 定时器定时原理 1.…

品牌舆情都包含什么内容?建议收藏

一个品牌的声誉、形象、产品质量、服务质量等,无时无刻不在接受着大众的检验。互联网传播迅速,一个不好的舆论直接导致整个品牌的声誉受到严重影响。品牌舆情都包含什么内容?接下来伯乐网络传媒就来给大家讲一讲。 一、品牌舆情的基本构成 1…

C++算法——函数对象\谓词\内置仿函数

目录 函数对象: 函数对象的定义: 函数对象的本质: 函数对象的特点: 谓词 谓词的形式: 内置函数对象 算法仿函数 关系仿函数 逻辑仿函数 函数对象: 函数对象的定义: C的函数对象是…

冯喜运:5.13黄金晚间还会跌吗?原油还会涨吗?

【黄金消息面分析】:自5月初以来,黄金和白银一直在享受需求的回归,买家在过去几天加大了力度,一度推动金价重返2370美元上方,白银重返28.5美元上方。不过,经过几天的盘整后,黄金白银价格双双下跌…

【npm】解决npm包突然消失MODULE_NOT_FOUND

今天折腾新特性时需要升级nodejs,安装新版后npm离奇消失了。C:\Users\**用户名\AppData\Roaming\npm\node_modules下只有cnpm,没有npm的目录。重装nodejs也不好使。 机智如我,试了下cnpm -v是正常的,而且能看到nodejs,…

什么是.faust勒索病毒?应该如何防御?

faust勒索病毒详细介绍 faust勒索病毒是一种新型的勒索软件,最早出现在2018年。该病毒通过加密计算机系统中的文件并要求支付赎金来解锁文件,从而获取经济利益。与传统的勒索软件相比,faust勒索病毒采用了更加先进的加密算法和隐藏技术&#…

山洪灾害无线预警广播系统的主要设备和功能

一、背景 山洪泥石流是指在山区或者其他沟谷深壑,地形险峻的地区,因为暴雨、暴雪或其他自然灾害引发的洪水、山体滑坡并携带有大量泥沙以及石块的特殊洪流。山洪泥石流等地质灾害具有突然性以及流速快,流量大,物质容量大和破坏力…

光数据传送器|光通讯传感器极速版OPT系列尺寸与安装步骤

光数据传送器|光通讯传感器极速版OPT系列是利用可见光及不可见光作为信息载体,无需光纤、网线等有线介质,在空中直接进行信息传输的无线方式通信。驱动光源以可见光及不可见光的高速明暗变化来传输数字信号,以极高光频率双向发射接收光信号&a…

python跟C++选哪个?

选择使用Python还是C取决于你的具体需求和项目背景。我这里有一套编程入门教程,不仅包含了详细的视频讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222,私信22,我在后台发给你。 在通信工程行业…

QT C++(QWidget类及其常见的属性)

文章目录 1. QWidget类及其常见的属性 1. QWidget类及其常见的属性 QT各种控件都是继承自QWidget类,QWidget类是QT控件体系中通用的部分。 QWidget属性如下图 常见的QT属性为: enabled:描述控件是否处于可用状态(禁用状态这个…

Python 求高斯误差函数 erf 和 erfc

文章目录 Part.I IntroductionPart.II 概念定义Chap.I 误差函数 erfChap.II 误差函数补 erfc Part.II 求值与绘图Chap.I 求取方式Chap.II 绘图 Reference Part.I Introduction 本文将对误差函数(ERror Function, ERF)进行简单的介绍,并探索如…

【Flutter】极光推送配置流程(VIVO/OPPO/荣耀厂商通道) 章三

前言 很高兴大家来看小编写的文章~~ 继【Flutter】极光推送配置流程(极光通道/华为厂商/IOS) 章一 继【Flutter】极光推送配置流程(小米厂商通道) 章二 接下配置VIVO/OPPO/华为荣耀的厂商通道 所有截图来源于公司项目,所以会有大量马赛克&am…

【C/C++】详解不同场景下的文件读写操作

🔗 运行环境:C/C 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 🔐#### 防伪水印——左手の明天 ####🔐 💗 大家好&…

虚拟数字人及AI相关应用分享

一、虚拟数字人 1、简介 虚拟数字人可分为基础类和仿真智能类。可用于直播的,一般是仿真智能类;基础类动作缓慢,体验差,很容易被直播平台封号。 目前各大短视频平台上介绍的数字人,出于营销目的,有夸大宣传…

代码随想录35期Day38-Java(Day37休息)

Day38题目 LeetCode509.斐波那契数列 核心思想:很简单dp[i]dp[i-1]dp[i-2].这里用了数组存储的形式,也可以递归 class Solution {public int fib(int n) {int[] dp new int[n2];dp[0] 0;dp[1] 1;for(int i 2 ; i < n ; i ){dp[i] dp[i-1] dp[i-2];}return dp[n];} …

go语言冒泡排序算法之泛型实现 支持整型,浮点型和字符串排序 golang bubble sort general

冒泡排序是一个比较经典的基础算法&#xff0c; 是学习编程的同学们所必备的算法之一&#xff0c;今天就介绍一个go语言里面使用泛型实现的冒泡排序算法&#xff0c; 支持字符串 string&#xff0c;数字 int float 等的排序。 在go语言中通常我们在进行数据比较时都是使用的c…

prophet时间序列模型水质预测应用

前言 此前已经分析了&#xff0c;ARIMA 模型在水质预测中的应用&#xff0c;今天用 prophet 模型测试下在水质预测中的效果。 Prophet 简介 Prophet 是 Facebook 于2017年开源的一个时间序列预测框架&#xff0c;特别适合于处理具有明显趋势性和季节性的数据。该模型设计初衷…

领略Java内部类的“内部”

内部类有两种情况&#xff1a; (1) 在类中定义一个类(私有内部类&#xff0c;静态内部类) (2) 在方法中定义一个类(局部内部类&#xff0c;匿名内部类) 1、私有内部类 —— 在方法之间定义的内部类&#xff0c;非静态 我们首先看看类中内部类的两个特点&#xff1a; (1) 在外部…

springboot3项目练习详细步骤(第三部分:文章管理模块)

目录 发布文章 接口文档 业务实现 自定义参数校验 项目参数要求 实现思路 实现步骤 文章列表(条件分页) 接口文档 业务实现 mapper映射 更新文章 接口文档 业务实现 获取文章详情 接口文档 业务实现 删除文章 接口文档 业务实现 文章管理业务表结构…

数据可视化训练第6天(美国人口调查获得关于收入与教育背景的数据,并且可视化)

数据来源 https://archive.ics.uci.edu/dataset/2/adult 过程 首先&#xff1b;关于教育背景的部分翻译有问题。 本次使用字典嵌套记录数据&#xff0c;并且通过lambda在sorted内部进行对某个字典的排序&#xff0c;最后用plotly进行绘图 本次提取数据的时候&#xff0c;用到…