数据库中 级联 详解

一:创建完成表之后添加外键并设置 级联 行为

在 MySQL 中,当您向一个表中添加外键约束时,这个外键会引用另一个表(称为父表)中的唯一值(通常是主键)。外键约束的主要目的是维护引用完整性,确保在子表(包含外键的表)中的数据在父表(被引用的表)中都有对应的值。

如果您在添加外键时没有指定特定的 `ON UPDATE` 和 `ON DELETE` 行为,那么默认的行为将是:

1. **`ON DELETE NO ACTION`** 或 **`ON DELETE RESTRICT`**:这意味着如果您尝试删除父表中的一行,而这一行在子表中被引用,MySQL 将不允许您执行这个删除操作,除非您同时删除或更新子表中的相关行。这样做是为了防止在子表中留下“悬挂”的外键。

2. **`ON UPDATE NO ACTION`** 或 **`ON UPDATE RESTRICT`**:这意味着如果您尝试更新父表中的主键(或唯一键,即外键所引用的列),而这一行在子表中被引用,MySQL 将不允许您执行这个更新操作,除非您同时更新子表中的相关外键值。这样做是为了防止子表中的外键不再能正确地引用父表中的行。

简而言之,如果没有指定 `ON DELETE` 和 `ON UPDATE` 的行为,那么在父表中进行的删除和更新操作将受到限制,以确保子表中的外键引用保持有效。这可以防止数据丢失和保持数据的一致性。

如果您希望在父表中进行删除或更新操作时自动更新或删除子表中的相关行,您可以指定 `ON DELETE CASCADE` 或 `ON UPDATE CASCADE`。但请注意,使用 `CASCADE` 选项时要非常小心,因为它会自动删除或更新子表中的行,可能会导致数据丢失。

例如,向 `子表` 添加外键时,可以这样指定:

```sql

ALTER TABLE `子表`
ADD CONSTRAINT `fk_父表_id` FOREIGN KEY (`外键列`)
REFERENCES `父表` (`主键列`)
ON DELETE CASCADE
ON UPDATE CASCADE;

请根据您的具体需求选择合适的行为,并确保了解这些行为对数据完整性的影响。

二:如何在创建表的同时指定外键,让外键具有 级联 的行为

在创建表时指定外键并设置级联行为,您可以在定义外键约束时使用 `ON DELETE CASCADE` 和 `ON UPDATE CASCADE` 子句。这样,当您在父表中删除或更新了一行,相应的子表中的行也会自动被删除或更新。

以下是创建表时添加具有级联行为的外键约束的示例:

```sql

CREATE TABLE `parent_table` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `parent_column` VARCHAR(255),
    PRIMARY KEY (`id`)
);

CREATE TABLE `child_table` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `child_column` VARCHAR(255),
    `parent_id` INT,
    PRIMARY KEY (`id`),
    FOREIGN KEY (`parent_id`)
    REFERENCES `parent_table` (`id`)
    ON DELETE CASCADE
    ON UPDATE CASCADE
);

在这个例子中,`child_table` 有一个名为 `parent_id` 的列,它作为外键引用 `parent_table` 的 `id` 列。如果 `parent_table` 中的一行被删除,那么 `child_table` 中所有 `parent_id` 引用了该行 `id` 的行也会被自动删除。同样,如果 `parent_table` 中的 `id` 被更新,`child_table` 中的 `parent_id` 也会自动更新为新的值。

请注意以下几点:

1. 在创建外键约束时,父表中的被引用列(在这个例子中是 `parent_table` 的 `id` 列)必须是主键或者是具有唯一约束的列。
2. 使用级联删除(`ON DELETE CASCADE`)时要特别小心,因为这会导致子表中的相关行被自动删除,可能会导致数据丢失。
3. 使用级联更新(`ON UPDATE CASCADE`)时,确保被更新的列不是父表的主键或具有唯一约束的列,否则可能会违反数据完整性。
4. 确保您的 MySQL 版本支持这些操作。级联约束在大多数现代的 MySQL 版本中都是支持的。

在实际应用中,请根据您的业务逻辑和数据完整性需求来决定是否使用级联行为。
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue的基本用法及模板语法

Vue.js使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue实例的数据。所有 Vue.js的模板都是合法的 HTML,所以能被遵循规范的浏览器和 HTML 解析器解析。 在底层的实现上,Vue将模板编译成虚拟 DOM 渲染函数。结合响应系…

10.2 Linux_进程_进程相关函数

创建子进程 函数声明如下: pid_t fork(void); 返回值:失败返回-1,成功返回两次,子进程获得0(系统分配),父进程获得子进程的pid 注意:fork创建子进程,实际上就是将父进程复制一遍作为子进程&…

【基础算法总结】链表篇

目录 一, 链表常用技巧和操作总结二,算法原理和代码实现2.两数相加24.两两交换链表中的节点143.重排链表23.合并k个升序链表25.k个一组翻转链表 三,算法总结 一, 链表常用技巧和操作总结 有关链表的算法题也是一类常见并且经典的题…

STM32-HAL库驱动DHT11温湿度传感器 --2024.9.28

目录 一、教程简介 二、驱动原理讲解 (一)通信4步骤 (二)传感器数据解析 三、CubeMX生成底层代码 (一)基础配置 (二)配置DHT11的驱动引脚 (三)配置串口 四…

pytest(三)——参数化@pytest.mark.parametrize

目录 前言 参数化场景 实际Web UI自动化中的开发场景,比如是一个登录框 parametrize单参数 “笛卡尔积”,多个参数化装饰器 重点知识 参考文献 前言 pytest.mark.parametrize 允许在测试函数或类中定义多组参数和fixtures pytest_generate_tests 允…

对于基础汇编的趣味认识

汇编语言 机器指令 机器语言是机器指令的集合 机器指令展开来讲就是一台机器可以正确执行的命令 电子计算机的机器指令是一列二进制数字 (计算机将其转变为一列高低电平,使得计算机的电子器件受到驱动,进行运算 寄存器:微处理器…

C(九)while循环 --- 军训匕首操情景

匕首操,oi~oi~oi~~~~~ 接下来的几篇推文,杰哥记录的是三大循环结构的运行流程及其变式。 本篇的主角是while循环。👉 目录: while循环 的组成、运行流程及其变式关键字break 和 continue 在while 循环中的作用while 循环的嵌套题目…

C/C++逆向:数据类型识别

在逆向工程中,数据类型识别是理解程序逻辑的重要步骤,因为它直接影响对程序逻辑和功能的理解,识别出数据类型有助于确定变量的含义和函数的行为。在分析恶意软件或者寻找安全漏洞时,识别数据类型能够帮助发现代码中的潜在问题。例…

【越学学糊涂的Linux系统】(5)shell命令以及运行原理|权限问题

Ⅰ.shell命名以及运行原理: 0x00引用: 什么是shell命令?? ✔️ Shell 是一种命令行解释器(Command - Line Interpreter),它为用户提供了与操作系统内核进行交互的接口。用户通过在 She…

【Qt】控件概述(3)—— 显示类控件

显示类控件 1. QLabel——标签1.1 setPixmap设置图片1.2 setAlignment设置文本对齐方式1.3 setWordWrap设置自动换行1.4 setIndent设置缩进1.5 setMargin设置边距1.6 body 2. QLCDNumber2.1 使用QTimer实现一个倒计时效果2.2 使用循环的方式实现倒计时 3. QProgressBar——进度…

【工程测试技术】第6章 信号处理初步,频谱分析,相关系数

目录 6.1 数字信号处理的基本步骤 6.2 离散信号及其频谱分析 6.2.1 概述 6.2.2 时域采样、混叠和采样定理 6.2.3 量化和量化误差 6.2.4 截断、泄漏和窗函数 6.2.5 频域采样、时域周期延拓和栅栏效应 6.2.6 频率分辨率、整周期截断 6.3 相关分析及其应用 6.3.1 两…

【C++】--类与对象(1)

🧇个人主页: 起名字真南 🌭个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 类的定义1.1 类定义格式1.1.1 Stack类1.1.2 Date类1.1.3 Struct格式 1.2 访问限定符1.3 类域 2 实例化2.2 对象大小 3 this指针 1 类的定义 1.1 类定义格式 1 class为定义…

解决磁盘负载不均——ElasticSearch 分片分配和路由设置

ES 分片分配(Shard Allocation)时间点: 初始恢复(Initial Recovery)副本分配(Replica Allocation)重平衡(Rebalance)节点添加或移除 小结: 准备移除节点时&a…

【Golang】关于Go语言字符串转换strconv

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

k8s-集群部署1

k8s-集群部署1 一、基础环境准备二、docker环境准备三、k8s集群部署1.kubeadm创建集群2.使用kubeadm引导集群 总结 一、基础环境准备 首先,需要准备三个服务器实例,这里我使用了阿里云创建了三个实例,如果不想花钱,也可以在VM上创…

1panel申请https/ssl证书自动续期

参考教程 https://hin.cool/posts/sslfor1panel.html #Acme 账户 #1panel.腾讯云dns账号 这里有一步不需要参考,腾讯云dns账号,就是子帐号授权 直接控制台搜索 访问管理 创建用户 授权搜索dns,选择第一个 点击用户名,去掉AdministratorAccess权限 5.点击api密钥生成即可…

CSS3练习--电商web

免责声明:本文仅做分享! 目录 小练--小兔鲜儿 目录构建 SEO 三大标签 Favicon 图标 布局网页 版心 快捷导航(shortcut) 头部(header) logo 导航 搜索 购物车 底部(footer&#xff0…

初学51单片机之I2C总线与E2PROM二

总结下上篇博文的结论: 1:ACK信号在SCL为高电平期间会一直保持。 2:在字节数据传输过程中如果发送电平跳变,那么电平信号就会变成重复起始或者结束的信号。(上篇博文的测试方法还是不能够明确证明这个结论&#xff0…

字符串和字符数组(2)

6.求字符串长度 C语言中有一个库函数叫strlen,这个函数是专门用来求字符串长度的。strlen的使用需要包含一个头文件string.h。 strlen函数统计的是字符串中\0之前的字符个数,所以传递给strlen函数的字符串中必须得包含\0. 请看代码: #inc…

数据结构 ——— 单链表oj题:链表分割(带哨兵位单向不循环链表实现)

目录 题目要求 手搓简易单链表 代码实现 题目要求 现有一链表的头指针 ListNode* head ,给一定值 x ,编写一段代码将所有小于 x 的节点排在其余节点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头节点 举例说明&a…