SQL 外键(Foreign Key)详细讲解
1. 什么是外键?
- 定义:外键是数据库表中的一列(或一组列),用于建立两个表之间的关联关系。外键的值必须匹配另一个表的主键(Primary Key)或唯一约束(Unique Constraint)的值。
- 作用:
- 确保数据的引用完整性(Referential Integrity),防止无效数据插入。
- 维护表之间的逻辑关系(如“一对多”或“多对多”)。
2. 外键的语法
在创建表时定义外键:
CREATE TABLE 子表 (列1 数据类型,列2 数据类型,...FOREIGN KEY (外键列) REFERENCES 父表(主键列)[ON DELETE 约束行为] [ON UPDATE 约束行为]
);
在已有表中添加外键:
ALTER TABLE 子表
ADD CONSTRAINT 约束名称
FOREIGN KEY (外键列) REFERENCES 父表(主键列)
[ON DELETE 约束行为] [ON UPDATE 约束行为];
3. 外键的约束行为
当父表的记录被删除或更新时,子表的外键如何处理?通过 ON DELETE
和 ON UPDATE
指定:
约束行为 | 说明 |
---|---|
CASCADE | 级联操作。父表删除/更新记录时,子表关联记录也被删除/更新。 |
SET NULL | 父表删除/更新记录时,子表的外键列设为 NULL(要求外键列允许 NULL)。 |
NO ACTION | 默认行为。阻止父表的删除/更新操作,如果子表存在关联记录。 |
RESTRICT | 类似 NO ACTION ,立即检查约束。 |
SET DEFAULT | 父表删除/更新记录时,子表的外键设为默认值(需定义默认值)。 |
4. 多列外键
外键可以由多个列组成,需满足:
- 子表和父表的列数、顺序、数据类型一致。
- 父表的列必须有唯一约束(如主键或唯一索引)。
示例:
CREATE TABLE 订单详情 (订单ID INT,产品ID INT,数量 INT,PRIMARY KEY (订单ID, 产品ID),FOREIGN KEY (订单ID) REFERENCES 订单(订单ID),FOREIGN KEY (产品ID) REFERENCES 产品(产品ID)
);
5. 外键的限制与注意事项
- 父表必须有主键或唯一约束。
- 外键列的数据类型必须与父表主键一致。
- 引擎支持:如 MySQL 的 InnoDB 支持外键,而 MyISAM 不支持。
- 性能影响:外键会增加数据操作的检查开销,但能提升数据一致性。
- 循环依赖:避免两个表互相引用。
6. 实际应用示例
场景:学生表(students
)和课程表(courses
),通过选课表(enrollments
)关联。
-- 父表:学生表
CREATE TABLE students (student_id INT PRIMARY KEY,name VARCHAR(50)
);-- 父表:课程表
CREATE TABLE courses (course_id INT PRIMARY KEY,course_name VARCHAR(50)
);-- 子表:选课表(含外键)
CREATE TABLE enrollments (student_id INT,course_id INT,enrollment_date DATE,FOREIGN KEY (student_id) REFERENCES students(student_id) ON DELETE CASCADE,FOREIGN KEY (course_id) REFERENCES courses(course_id) ON DELETE RESTRICT
);
插入数据:
-- 插入学生和课程
INSERT INTO students VALUES (1, 'Alice');
INSERT INTO courses VALUES (101, 'Math');-- 合法插入:学生和课程存在
INSERT INTO enrollments VALUES (1, 101, '2023-10-01');-- 非法插入:学生不存在,触发外键错误
INSERT INTO enrollments VALUES (999, 101, '2023-10-01'); -- 报错!
7. 常见问题
-
外键必须指向主键吗?
不,可以指向父表的唯一约束(Unique Constraint)。 -
能否跨数据库引用?
通常不支持,外键需在同一数据库内。 -
外键是否允许 NULL?
如果外键列允许 NULL,则插入 NULL 是合法的(表示无关联)。 -
如何查看外键约束?
使用数据库工具或查询元数据(如 MySQL 的SHOW CREATE TABLE
)。
8. 总结
- 外键的核心作用:维护数据的一致性和关联性。
- 适用场景:需要强数据完整性的系统(如电商、金融)。
- 慎用场景:高并发写入且对性能要求极高的系统(需权衡一致性与性能)。
相关文章:
SQL 外键(Foreign Key)详细讲解
1. 什么是外键? 定义:外键是数据库表中的一列(或一组列),用于建立两个表之间的关联关系。外键的值必须匹配另一个表的主键(Primary Key)或唯一约束(Unique Con…...
B3647 【模板】Floyd
题目链接:点击进入 题目 思路 代码 #include <bits/stdc.h> #define inf 0x3f3f3f3f using namespace std; const int maxn 1e6 10;int n,m,g[110][5000];int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m;memse…...
配置镜像端口和观察接口
top: 在G0/0/2上抓包通过其他端口ping pc4 可以看到 Wireshark 抓包没有任何反应,做个镜像端口并配置(观察接口和镜像接口) observe-port interface g0/0/2 #命令配置观察端口mirror to observe-port both …...
爬虫解决debbugger之替换文件
鼠鼠上次做一个网站的时候,遇到的debbugger问题,是通过打断点然后编辑断点解决的,现在鼠鼠又学会了一个新的技能 首先需要大家下载一个reres的插件,这里最好用谷歌浏览器 先请大家看看案例国家水质自动综合监管平台 这里我们只…...
erlang的安装-linux
1:解压 tar -zxvf 安装包 2:进入解压的目录执行: ./configure --prefix/usr/local/erlang --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe --without-javac 3:编译安装: m…...
Android Coil 3默认P3色域图加载/显示不出来
Android Coil 3默认P3色域图加载/显示不出来 解决,需要在Androidmanifest.xml使用Coil 3的activity配置属性: <activityandroid:colorMode"wideColorGamut"...</activity>...
【LaTeX】安装
Register - Overleaf, 在线LaTeX编辑器 注册Overleaf 安装 Latex2022 安装教程(附安装资源)_tex2022安装教程-CSDN博客 注:先安装 texlive,再安装TexStudio \documentclass{article} % 这里是导言区 \begin{document}Hello, wor…...
【2025年认证杯数学中国数学建模网络挑战赛】A题 解题建模过程与模型代码(基于matlab)
目录 【2025年认证杯数学建模挑战赛】A题解题建模过程与模型代码(基于matlab)A题 小行星轨迹预测解题思路第一问模型与求解第二问模型与求解 【2025年认证杯数学建模挑战赛】A题 解题建模过程与模型代码(基于matlab) A题 小行星轨…...
【KWDB 创作者计划】KWDB 数据库全维度解析手册
——从原理到实践,构建下一代数据基础设施 第一章:KWDB 设计哲学与技术全景 1.1 为什么需要 KWDB? 在数据爆炸与业务场景碎片化的今天,传统数据库面临三大挑战:扩展性瓶颈(单机性能天花板ÿ…...
低代码开发能否取代后端?深度剖析与展望-优雅草卓伊凡
低代码开发能否取代后端?深度剖析与展望-优雅草卓伊凡 在科技迅猛发展的当下,软件开发领域新思潮与新技术不断涌现,引发行业内外热烈探讨。近日,笔者收到这样一个颇具争议的问题:“低代码开发能取代后端吗?…...
LeetCode hot 100—最长回文子串
题目 给你一个字符串 s,找到 s 中最长的 回文 子串。 示例 示例 1: 输入:s "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。示例 2: 输入:s "cb…...
蓝桥杯知识总结
文章目录 1.常用的数学方法2.大小写转换3.数组和集合排序数组排序集合排序 4.控制小数位数5.栈6.队列7.字符串相关方法8.十进制转n进制模板字符转为十进制某进制转化为十进制 9.前缀和10.差分11.离散化12.双指针13.二分14.枚举模板组合型枚举模板排列型枚举模板 15.搜索算法BFS…...
leetcode:2839. 判断通过操作能否让字符串相等 I(python3解法)
难度:简单 给你两个字符串 s1 和 s2 ,两个字符串的长度都为 4 ,且只包含 小写 英文字母。 你可以对两个字符串中的 任意一个 执行以下操作 任意 次: 选择两个下标 i 和 j 且满足 j - i 2 ,然后 交换 这个字符串中两个…...
Python Lambda表达式详解
Python Lambda表达式详解 1. Lambda是什么? Lambda是Python中用于创建匿名函数(没有名字的函数)的关键字,核心特点是简洁。它适用于需要临时定义简单函数的场景,或直接作为参数传递给高阶函数(如map()、f…...
Matlab 平衡车的建模与控制
1、内容简介 Matlab 189-平衡车的建模与控制 可以交流、咨询、答疑 2、内容说明 略 平衡车的建模与控制 选择一款平衡车(如:小米九号平衡车等),并估计平衡车的关键参数。完成以下工作: 1. 建立平衡车模型…...
KWDB创作者计划—KWDB关系库与时序库混搭
📢📢📢📣📣📣 作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…...
Android studio2024的第一个安卓项目
目录 一、创建项目 1、创建Empty Views Activity类型项目 2、Android项目结构解析 manifests 目录: Gradle Scripts目录 3、创建安卓应用 二、测试 1、模拟器测试效果 2、连接真机,然后直接选择真机运行即可(点击Run或Shift F10运行…...
航电系统之障碍物监测技术篇
航电系统的障碍物监测技术是保障飞行安全、提升飞行效率的核心技术之一,尤其在复杂环境和低空飞行中发挥着关键作用。以下从技术原理、传感器类型、数据处理与应用等方面进行系统介绍: 一、技术原理 航电系统的障碍物监测技术通过多传感器融合和智能算法…...
网站DDoS防护方案——构建企业级安全屏障的关键路径
本文深度解析DDoS攻击最新演变趋势与防御技术体系,通过攻击特征图谱、云原生防护架构、混合防御模型等维度,揭示企业级网站防护方案的设计逻辑。结合2023年金融行业千万级QPS攻击事件,引用Gartner最新防御技术成熟度曲线,给出可落…...
Linux系统使用lshw生成硬件报告方法
使用 lshw 生成 HTML 硬件报告指南 一、工具简介 lshw(List Hardware)是 Linux 系统下用于检测并报告硬件详细信息的命令行工具,支持输出多种格式(文本、HTML、XML 等)。 核心功能: 显示 CPU、内存、磁盘、PCI/USB 设备等完整硬件信息生成结构化报告,便于存档或分析支…...
力扣 905 按奇偶排序数组:双指针法的优雅实现
目录 问题背景 题目解析 解题思路 暴力解法 双指针法 代码实现 代码解析 算法效率 实际应用场景 总结 问题背景 在编程的世界里,数组排序问题一直是经典中的经典。今天我们要解决的是一个有趣的变种:按奇偶排序数组。题目要求我们将一个整数数…...
LeetCode hot 100—子集
题目 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 示例 1: 输入:nums [1,2,3] 输出:[[],[1],[2…...
BERT - BertTokenizer, BertModel API模型微调
本节代码将展示如何在预训练的BERT模型基础上进行微调,以适应特定的下游任务。 ⭐学习建议直接看文章最后的需复现代码,不懂得地方再回看 微调是自然语言处理中常见的方法,通过在预训练模型的基础上添加额外的层,并在特定任务的…...
通过代码获取接口文档工具
通过代码获取接口文档工具 介绍使用到的技术使用说明核心源码演示截图工具源码 介绍 1.通过前后端代码来生成规格化的接口文档 2.支持拖拽上传或点击选择文件,可以一次选择多个文件或选择文件夹 3.用户选择前后端代码,工具调用GPT解析,得到规…...
不再卡顿!如何根据使用需求挑选合适的电脑内存?
电脑运行内存多大合适?在选购或升级电脑时,除了关注处理器的速度、硬盘的容量之外,内存(RAM)的大小也是决定电脑性能的一个重要因素。但究竟电脑运行内存多大才合适呢?这篇文章将帮助你理解不同使用场景下适…...
leetcode589 N叉树的前序遍历
前序遍历的顺序是:根节点 -> 子节点1 -> 子节点2 -> ... -> 子节点N 递归: class Solution { private:void traverse(Node* cur, vector<int>& res){if(cur NULL) return;res.push_back(cur->val);for(Node* child: cur->…...
游戏引擎学习第216天
回顾并为当天做准备 你可以看到,游戏现在正在运行。如果我没记错的话,我们之前把调试系统关闭了,留下一个状态,让任何想要在这段时间内进行实验的人可以自由操作,因为我们还没有完全完成这个系统。所以这样做是为了确…...
JavaSE反射机制干货
1.反射(Relection) 理解 定义:程序运行状态,动态地获取程序信息及调用程序功能即为java反射机制 2.获取class对象 掌握 2.1 Java代码的3个阶段 Java代码在计算机中经历的三个阶段:Source源代码阶段-Class类对象阶段-Runt…...
[特殊字符] 第十一讲 | 空间回归模型实战:SAR / SEM / GWR逐个击破
📘 专栏:科研统计方法实战分享 | 地学/农学人的数据分析工具箱 ✍️ 作者:平常心0715 🔑 本讲关键词:空间滞后模型(SAR)、空间误差模型(SEM)、地理加权回归(G…...
AI前沿周报:2025年3月技术深度解析
以下是基于2024-2025年AI技术前沿动态的深度技术周报示例,结合行业最新突破与研究进展,突出技术原理与应用场景分析: AI前沿周报:2025年3月技术深度解析 时间范围:2025年3月1日-3月31日 本期焦点:模型透明…...
aidigu开源微博项目程序,PHP开发的开源微博系统,自媒体个人创业、网盘推广首先
一、软件介绍 文末提供程序和源码下载学习 PHP开发的开源微博系统,采用PHP MySQL开发,框架采用ThinkPHP5.1,用户登录后拥有专属ID,支持表情、关注用户,网盘分享等功能,支持图片上传,视频上传,网盘存储分享…...
Tabnet介绍(Decision Manifolds)和PyTorch TabNet之TabNetRegressor
Tabnet介绍(Decision Manifolds)和PyTorch TabNet之TabNetRegressor Decision ManifoldsTabNet1.核心思想2. 架构组成3. 工作流程4. 优点PyTorch TabNetTabNetRegressor参数1. 模型相关参数`n_d``n_a``n_steps``gamma``cat_idxs``cat_dims``cat_emb_dim`2. 训练相关参数`opti…...
格瑞普Tattu正式成为2025年中国无人机竞速联赛官方赞助商!
格瑞普Tattu正式成为2025年中国无人机竞速联赛官方赞助商! 为飞手赋能,为赛事护航! Tattu是深圳市格瑞普电池有限公司(Grepow)旗下的子品牌之一,专注为无人机、FPV和模型爱好者提供专业可靠的电池和充电器等一站式电源解决方案。凭借卓越的放电性能、稳…...
PySide6 监测设备变更事件
在PySide6中监听系统事件,判断是否有串口设备插拔,进而当串口状态变更时,实现列表数据实时更新。 在Qt中,可以使用 nativeEvent 接口来完成这一操作: [virtual protected] bool QWidget::nativeEvent(const QByteArray…...
嵌入式系统的历史与发展
目录 引言 一、嵌入式系统的早期萌芽 1、首个现代嵌入式系统 2、早期未成形嵌入式系统的应用 二、以单片机为主的初级阶段 1、工业领域应用 2、大型家电领域应用 三、处理器升级与多样化应用阶段 1、数字化电子化设备涌现 (1)智能仪表…...
mysql调试记录
ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY password; 该命令在调试python使用pymysql连接数据库出现错误时, 报错为pymysql.err.OperationalError: (1045, "Access denied for user rootlocalhost (using password: NO)") m…...
【后端开发】Spring MVC阶段总结
文章目录 快捷引入依赖lombok的使用Lombok依赖Lombok使用Lombok注解 三层架构分层的目的MVC与分层的区别三层架构分层的好处 企业命名规范常见命名命名风格介绍大驼峰风格小驼峰风格包名 常见注解Cookie与Session 快捷引入依赖 这个方法可以快捷引入依赖,但是引入依…...
netty-socketio + springboot 消息推送服务
netty-socketio springboot 消息推送服务 后端1. 目录结构:代码pom文件:application.yml:SocketIOConfig:PushMessage:ISocketIOServiceSocketIOServiceImpl:pushMessageController:启动类&…...
基于 JavaWeb 的 SSM 在线视频教育系统设计和实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
同时打开多个Microchip MPLAB X IDE
0.引用 Microchip 32位MCU CAN驱动图文教程-附源码 - 哔哩哔哩 https://bbs.21ic.com/icview-3391426-1-1.html https://bbs.21ic.com/icview-3393632-1-1.html 1.前言 工作中接触到使用Microchip 的 MPLAB X IDE 开发工具,使用的MCU是Microchip SAMD21J18A MCU…...
dify 500错误
问题 升级到1.2.0 后所有页面接口均报错500, 环境: docker 本地部署 version:1.2.0 解决办法 1.首先关闭服务 docker compose down2.找到docker-compose.yaml里的plugin_daemon,参照下面修改参数 plugin_daemon:environment:PLUGIN_MAX_EXECUTION…...
WPF设计标准学习记录26
画刷名称功能说明SolidColorBrush使用单一的连续颜色填充区域LinearGradientBrush使用线性渐变绘制区域。RadialGradientBrush使用径向渐变绘制区域。 焦点定义渐变的开始,而圆定义渐变的终点。ImageBrush使用图像绘制区域。VisualBrush使用一个视图绘制区域。BitmapCacheBrus…...
cin,cin.get(),getchar(),getline(),cin.get line()异同点
文章目录 1.cin2.cin.get()3.getchar()4.cin.getline()5.getline() 1.cin (1)cin>>等价于cin.operator>>(),即调用成员函数operator>>()进行读取数据。 (2)当cin>>从缓冲区中读取数据时&…...
7# 5多线-7 不会停
7# 5多线-7 不会停 分析,明显线接错了,打自动时也能手动启停,打手动无法启停,这时远程只能启ka3,无法启ka4。排查手自转换2上没接线,接到8上了(13和12接错了,也就是sac的5和6接错了)…...
基于混合编码器和边缘引导的拉普拉斯金字塔网络用于遥感变化检测
Laplacian Pyramid Network With HybridEncoder and Edge Guidance for RemoteSensing Change Detection 0、摘要 遥感变化检测(CD)是观测和分析动态土地覆盖变化的一项关键任务。许多基于深度学习的CD方法表现出强大的性能,但它们的有效性…...
机器学习 从入门到精通 day_04
1. 决策树-分类 1.1 概念 1. 决策节点 通过条件判断而进行分支选择的节点。如:将某个样本中的属性值(特征值)与决策节点上的值进行比较,从而判断它的流向。 2. 叶子节点 没有子节点的节点,表示最终的决策结果。 3. 决策树的…...
CLAHE算法介绍
限制对比度自适应直方图增强 CLAHE 算法介绍 1. CLAHE算法框图2.直方图clip及重分配2.1 opencv自带2.2 scikit-image2.3 结果对比2.4 clip limit的性质3.插值参考文献上图来自 K. Zuiderveld: Contrast Limited Adaptive Histogram Equalization。 图中可以看到各种直方图均衡的…...
高并发的业务场景下,如何防止数据库事务死锁
一、 一致的锁定顺序 定义: 死锁的常见原因之一是不同的事务以不同的顺序获取锁。当多个事务获取了不同资源的锁,并且这些资源之间发生了互相依赖,就会形成死锁。 解决方法: 确保所有的事务在获取多个锁时,按照相同的顺序请求锁。例如,如果事务A需要锁定表A和表B,事务…...
使用Python从零实现一个端到端多模态 Transformer大模型
嘿,各位!今天咱们要来一场超级酷炫的多模态 Transformer 冒险之旅!想象一下,让一个模型既能看懂图片,又能理解文字,然后还能生成有趣的回答。听起来是不是很像超级英雄的超能力?别急,…...
elestio memos SSRF漏洞复现(CVE-2025-22952)(附脚本)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 前言…...