通俗易懂:MySQL中的FOREIGN KEY约束有什么作用?如何创建和删除?

在MySQL数据库中,FOREIGN KEY(外键)约束是一个重要的概念,它主要用于维护数据库表之间的引用完整性。其主要作用有以下几点:

1. 参照完整性保证

- 外键约束确保了一个表(称作“从表”或“子表”)中的特定列(外键列)的值必须匹配另一个表(称作“主表”或“父表”)的主键列的值或者是NULL。

- 这意味着在从表中插入或更新记录时,它的外键值必须已经存在于主表的主键列中,或者允许为空(如果外键允许NULL值的话)。

2. 数据一致性

- 当在主表中删除或更新主键值时,可以通过定义ON DELETE和ON UPDATE规则来决定如何处理从表中的关联记录,比如CASCADE(级联)、SET NULL、RESTRICT(限制)等,以保持数据的一致性。

创建外键约束

创建外键约束通常在创建新表或修改已有表结构时进行。以下是一个创建带有外键约束的表的例子:

-- 假设有两个表,一个是Customers表,一个是Orders表

-- 先创建主表Customers,其中CustomerID为主键

CREATE TABLE Customers (

CustomerID INT PRIMARY KEY,

Name VARCHAR(100),

-- 其他列...

);

-- 创建从表Orders,其中CustomerID作为外键引用Customers表的CustomerID

CREATE TABLE Orders (

OrderID INT PRIMARY KEY,

OrderDate DATE,

CustomerID INT,

-- 其他列...

FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)

ON DELETE CASCADE ON UPDATE CASCADE

);

在这个例子中,`Orders` 表中的 `CustomerID` 列是一个外键,它引用 `Customers` 表的 `CustomerID` 主键。同时指定了 `ON DELETE CASCADE` 和 `ON UPDATE CASCADE`,这意味着当 `Customers` 表中相应的 `CustomerID` 被删除或更新时,`Orders` 表中相关的订单也会自动删除或更新对应的 `CustomerID`。

删除外键约束

要删除已存在的外键约束,可以使用 `ALTER TABLE` 语句:

-- 假设我们想移除Orders表上的CustomerID外键约束

ALTER TABLE Orders

DROP FOREIGN KEY fk_CustomerID; -- 注意这里fk_CustomerID是要删除的外键约束的名称

-- 如果不知道外键约束的具体名称,可以先查询表结构

SHOW CREATE TABLE Orders;

在上述示例中,你需要知道要删除的外键约束的确切名称,通常是在`SHOW CREATE TABLE`的结果中可以看到。如果不指定名称,可以根据查询结果中的外键约束定义来明确写出要删除的约束名称。如果一开始创建外键时未命名,MySQL会默认为其分配一个名称,但在删除时直接写明名称会更加清晰。

例子:

超市购物清单的选择策略

想象一下,光头强是个精打细算的家庭采购员,他手上有张长长的购物清单,需要在超市里找到并购买所有物品。这里有两种策略:

策略A:利用商品分类标签和货架导航图(类似索引),快速定位到每个商品所在的区域,依次获取清单上的商品。

策略B:从超市入口开始,逐排逐列地检查货架上的每一个商品,直到找到清单上的所有物品。

光头强会选择哪种策略呢?他会考虑以下几个因素:

- 购物清单的长度和具体商品种类

- 商品是否经常出现在特定货架上(类似索引的有效性)

- 超市的布局与货架导航图的准确性

- 每种方式下行走的距离和时间消耗

如果大部分商品都有清晰的位置标识且货架导航图高效,那么采用策略A能快速定位,减少走动距离和时间。反之,如果商品位置随机无序或清单中的商品在各处分散均匀,策略B全扫一遍可能反而是较快的方式。

同样地,MySQL查询优化器会根据表的数据分布、索引状况及查询条件等因素,估算不同执行计划的成本,从而选择最快捷的方式来完成SQL查询任务。

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

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

相关文章

【办公类-21-11】 20240327三级育婴师 多个二级文件夹的docx合并成docx有页码,转PDF

背景展示:有页码的操作题 背景需求: 实操课终于全部结束了,把考试内容(docx)都写好了 【办公类-21-10】三级育婴师 视频转文字docx(等线小五单倍行距),批量改成“宋体小四、1.5倍行…

数据库学习(四)mybatis

Mybatis Mybatis是一个基于数据持久层(DAO层)的一款框架,他能极大的简化Java中连接数据库,操作数据库也就是jdbc的操作。 在定义mybatis相关接口时,不需要定义实现类,因为在程序启动时,mybati…

docker启动rocketmq简洁教程

docker启动rocketmq 打开云服务器防火墙 配置外网访问创建容器外部存储文件:mkdir -p /root/rocketmq/data/namesrv/logs /root/rocketmq/data/namesrv/store /root/rocketmq/conf /root/rocketmq/data/broker/logs /root/rocketmq/data/broker/store进入到 /root/…

Python环境下一种新的类谱峭度算法的旋转机械故障诊断模型

谱峭度SK的本质是计算每根谱线峭度值的高阶统计量,谱峭度对信号中的瞬态冲击成分十分敏感,能有效的从含有背景噪声信号中识别瞬态冲击及其在频带中的分布。由于谱峭度的复杂性、缺少一个正式的定义和一个容易理解的计算过程使其在很长时间内都未能引入到…

Redis入门到实战-第六弹

Redis实战热身Lists篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的(采用BSD许可证),用作数据库、缓存、消息代理和流…

kubectl 启用shell自动补全功能

官网手册参考:https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux/ 系统:centos7 补全脚本依赖于工具 bash-completion, 所以要先安装它(可以用命令 type _init_completion 检查 bash-completion 是否已安装&a…

PTA布尔矩阵的奇偶性

一个布尔方阵具有奇偶均势特性,当且仅当每行、每列总和为偶数,即包含偶数个1。如下面这个4*4的矩阵就具有奇偶均势特性: ⎣⎡​1010​0011​1010​0011​⎦⎤​ 编写程序,读入一个n阶方阵并检查它是否具有奇偶均势特性。如果没有…

2024年腾讯云优惠券领取教程及使用攻略分享

随着云计算技术的快速发展,腾讯云作为国内领先的云计算服务提供商,为企业和个人提供了丰富的云产品和服务。为了帮助大家更好地了解和使用腾讯云,本文将为大家详细介绍2024年腾讯云优惠券领取教程及使用攻略。 一、腾讯云优惠券介绍说明 腾讯…

linux性能调优汇总(一)cpu

目录 一、引言 二、CPU ------>2.1、/proc/cpuinfo ------>2.2、cpuid指令 ------>2.3、lscpu ------>2.4、turbostat ------>2.5、rdmsr ------>2.6、perf ------>2.7、top ------>2.8、ps ------>2.9、pidstat 查看每个进程CPU、内存、…

【CSP试题回顾】201812-1-小明上学(优化)

CSP-201812-1-小明上学 解题代码 #include <iostream> using namespace std;int r, y, g, n, k, t, sumTime;int main() {cin >> r >> y >> g >> n;for (size_t i 0; i < n; i){cin >> k >> t;if (k 0)sumTime t;else if(k1…

成都克鲁斯机器人电路板故障维修攻略,快来了解一下!

一、克鲁斯机器人电路板维修步骤 断开电源&#xff1a;在进行电路维修前&#xff0c;务必断开机器人的电源&#xff0c;确保安全。 拆卸电路板&#xff1a;根据电路图或维修手册&#xff0c;小心拆卸故障电路板。注意记录拆卸过程中的细节&#xff0c;以便后续重新安装。 更换损…

基于 VB6的猜拳游戏

基于 VB6的猜拳游戏 1 欢迎页的制作 welcomeFrom 添加一个定时器 代码如下&#xff1a; Private Sub Form_Load()定时器Timer1的时间间隔设置为1000毫秒Timer1.Interval 1000Timer1.Enabled TrueEnd SubPrivate Sub Timer1_Timer()关闭当前窗体Unload MeReadyFrom.Show…

验证码/数组元素的复制.java

1&#xff0c;验证码 题目&#xff1a;定义方法实现随机产生一个5位的验证码&#xff0c;前面四位是大写或小写的英文字母&#xff0c;最后一位是数字 分析&#xff1a;定义一个包含所有大小写字母的数组&#xff0c;然后对数组随机抽取4个索引&#xff0c;将索引对应的字符拼…

内网exp对抗

内网工具对抗 首先&#xff0c;你需要分析&#xff1a; 1、安全工具是否有源代码 2、安全工具源代码逻辑复杂程度 3、当前源代码你是否有能力修改 其次&#xff0c;你需要考虑&#xff1a; 1、无源码或无能力修改 2、各种异常bug打包问题 3、修改打包后效果也不太好 故…

【Linux】详解进程终止进程等待

一、页表&&写时拷贝的进一步理解 页表中不仅仅只有虚拟地址到物理地址的映射&#xff0c;还包括了很多选项&#xff0c;其中就包括了映射条目的权限。当我们进程的代码和数据加载到内存并和进程地址空间建立映射关系时&#xff0c;如果数据的内容不允许被修改&#xff…

PTA------ 敲笨钟

字符串处理问题&#xff01;------->字符串处理相关操做 代码&#xff1a; #include <iostream> #include<algorithm> #include<cmath> #include<cstring> #include<set> #include<stack> #include<queue> #include<map>…

【Java.mysql】——数据删改(DU) 附加数据库约束

目录 &#x1f6a9;更新(Update) &#x1f6a9;删除&#xff08;Delete&#xff09; &#x1f6a9;数据库约束 &#x1f388;约束类型 ✅NULL约束 ✅NNIQUE 唯一约束 ✅DEFAULT&#xff1a;默认值约束 ✅PRIMARY KEY&#xff1a;主键约束 ✅FOREIGN KEY&#xff1a;外键…

什么是字典序?字典序详解

字典序&#xff0c;也称为词典序、字典顺序、字母序或词序&#xff0c;是指在排序时&#xff0c;按照字母顺序或数字顺序等自然顺序进行排序的方法。通常&#xff0c;字典序应用于字符串排序&#xff0c;但也适用于其他类型的数据结构。 对于字符串来说&#xff0c;字典序的排…

探究 Switch Case 和 While 循环:两种强大的控制结构

在计算机编程中&#xff0c;控制结构是指用于控制程序执行流程的特殊语句或语法。这些结构使程序能够根据不同的条件执行不同的操作&#xff0c;从而增强了程序的灵活性和功能性。本文将介绍两种常见的控制结构&#xff1a;Switch Case 和 While 循环&#xff0c;并通过示例代码…

【前端】Layui的表格常用功能,表单提交事件,表格下拉按钮点击事件,表格外的按钮点击事件

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《前端》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…