理解MySQL核心技术:外键的概念作用和应用实例

引言

在数据库管理系统(DBMS)中,外键(Foreign Key)是维持数据一致性和实现数据完整性的重要工具。本文将详细介绍MySQL外键的基本概念、作用,以及相关的操作指南和应用实例,帮助读者掌握并灵活运用外键约束。
image.png

一、外键的基本概念

外键是一种数据库约束,用于在两张表之间建立关系,使得子表中的某个字段或字段组合引用父表的主键或唯一键。通过外键,可以确保相关联的数据在各表之间保持一致性。
image.png

定义和命名

在MySQL中,定义外键的基本语法如下:

[CONSTRAINT [symbol]] FOREIGN KEY[index_name] (col_name, ...)REFERENCES tbl_name (col_name,...)[ON DELETE reference_option][ON UPDATE reference_option]

在上述语法中:

  • CONSTRAINT [symbol]:用于指定外键约束的名字,如果省略,则MySQL会自动生成一个唯一的名字。
  • FOREIGN KEY [index_name] (col_name, ...):指定子表中的外键列。
  • REFERENCES tbl_name (col_name,...):指定父表及其列。
  • ON DELETE | ON UPDATE reference_option:定义在删除或更新父表记录时的行为选项。

二、外键的作用

外键的主要作用包括:

1. 维护数据一致性

外键确保子表中的数据只能引用父表中存在的值。例如,在一个订单表中,每个订单都应关联到一个有效的客户,避免出现孤立的订单记录。

2. 实现参照完整性(Referential Integrity)

外键可以防止删除或更新父表中的记录时导致子表中的数据无效。通过不同的参照操作,如CASCADESET NULL等,外键可以定义何种行动以保证数据的完整性。

三、外键的操作

以下是创建、修改和删除外键的重要操作实例:

1. 创建外键

在创建表时定义外键:

CREATE TABLE customers (customer_id INT PRIMARY KEY,name VARCHAR(100)
) ENGINE=INNODB;CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,order_date DATE,customer_id INT,CONSTRAINT fk_customerFOREIGN KEY (customer_id)REFERENCES customers(customer_id)ON DELETE CASCADEON UPDATE CASCADE
) ENGINE=INNODB;

在上述例子中,orders表中的customer_id字段是一个外键,引用customers表中的customer_id主键。

2. 修改表添加外键

可以使用ALTER TABLE命令为已有表添加外键:

ALTER TABLE ordersADD CONSTRAINT fk_customerFOREIGN KEY (customer_id)REFERENCES customers(customer_id)ON DELETE CASCADEON UPDATE CASCADE;
3. 删除外键

删除外键约束可以使用以下命令:

ALTER TABLE ordersDROP FOREIGN KEY fk_customer;

在删除外键之前,需要先知道外键的名字,可以通过SHOW CREATE TABLE查看:

SHOW CREATE TABLE orders;

四、外键参照操作

外键的ON DELETEON UPDATE子句定义了在父表中的记录被删除或更新时,子表如何响应。可选的参照操作有:

  • CASCADE:删除或更新父表的记录时,自动删除或更新子表的匹配记录。
  • SET NULL:删除或更新父表的记录时,将子表的外键列设置为NULL。需要确保外键列允许NULL
  • RESTRICT:拒绝删除或更新操作,即使子表中存在引用该记录的记录。
  • NO ACTION:与RESTRICT相同,对于InnoDB存储引擎立即拒绝操作。
  • SET DEFAULT:当前不被InnoDB支持,如果定义,MySQL解析器会识别,但会被拒绝。

五、外键的实际应用

以下是一些常见的外键使用场景及其详细示例:

示例1:维护订单和客户的关系(CASCADE操作)
CREATE TABLE customers (customer_id INT PRIMARY KEY,name VARCHAR(100)
) ENGINE=INNODB;CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,order_date DATE,customer_id INT,CONSTRAINT fk_customerFOREIGN KEY (customer_id)REFERENCES customers(customer_id)ON DELETE CASCADEON UPDATE CASCADE
) ENGINE=INNODB;

在上述关系中,如果删除一个客户记录,所有关联的订单记录也会一同被删除,确保数据的一致性。

示例2:设置为NULL操作
CREATE TABLE customers (customer_id INT PRIMARY KEY,name VARCHAR(100)
) ENGINE=INNODB;CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,order_date DATE,customer_id INT,CONSTRAINT fk_customerFOREIGN KEY (customer_id)REFERENCES customers(customer_id)ON DELETE SET NULLON UPDATE SET NULL
) ENGINE=INNODB;

使用SET NULL策略,当一个客户记录被删除或更新时,相关的订单记录的customer_id字段会被设置为NULL,前提是该字段允许NULL

示例3:拒绝删除和更新操作(RESTRICT操作)
CREATE TABLE customers (customer_id INT PRIMARY KEY,name VARCHAR(100)
) ENGINE=INNODB;CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,order_date DATE,customer_id INT,CONSTRAINT fk_customerFOREIGN KEY (customer_id)REFERENCES customers(customer_id)ON DELETE RESTRICTON UPDATE RESTRICT
) ENGINE=INNODB;

在这个例子中,如果一个客户记录被引用在订单表中,则无法删除或更新该客户记录,强制执行数据完整性。

六、外键的注意事项

  1. 存储引擎:只有InnoDB存储引擎支持外键约束,因此创建支持外键的表时要确保使用InnoDB
  2. 字段类型与长度:外键列和被引用的列必须具有相同的数据类型和长度。例如,如果父表中的列是INT(10), 则子表中的外键字段也必须是INT(10)
  3. 索引:外键列必须有索引,如果没有,MySQL会自动创建一个索引。
  4. 数据一致性:确保插入子表记录时引用的父表记录存在,且删除或更新父表记录不会违反外键约束。
  5. 性能考虑:外键约束可能会影响插入、删除和更新操作的性能,特别是当涉及大量数据时。

七、总结一下

本文介绍了MySQL外键的基本概念、作用和操作方法,并结合实际应用的示例展示了不同的参照操作。通过外键,开发者可以轻松维护数据库中各表数据的关联性和完整性,从而提升数据管理的可靠性和一致性。
掌握外键的使用方法不仅有助于设计合理的数据库结构,还可以有效地防止数据异常和错误。在实际开发中,合理配置和使用外键约束,将大大提高数据库系统的健壮性和数据完整性。

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

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

相关文章

YOLOv8的5种不同部署方式推理速度对比:Pytorch、ONNX、OpenVINO-FP32、OpenVINO-int8、TensorRT

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

FatFs(文件系统)

1官网 FatFs - 通用 FAT 文件系统模块 (elm-chan.org) FatFs 是用于小型嵌入式系统的通用 FAT/exFAT 文件系统模块。FatFs 模块是按照 ANSI C (C89) 编写的,并且与磁盘 I/O 层完全分离。因此,它独立于平台。它可以集成到资源有限…

安全与加密常识(5)自签名证书

文章目录 什么是自签名证书?自签名证书有什么优势?自签名证书有什么缺陷?企业可以使用自签名证书吗?如何创建自签名证书?前面我们介绍了什么是证书签名请求:证书签名请求(Certificate Signing Request,CSR)是一种数据文件,通常由申请者生成,并用于向证书颁发机构(C…

webpack打包配置

基于webpack5.x 一、缓存设置 // 内存缓存: 速度快,配置简单,但占用内存且重启后失效 cache: {type: memory, }// 磁盘缓存 (filesystem):持久性好,适合大型项目,但速度较慢,配置相对复杂。 cache: {type:…

华为智能驾驶方案剖析

华为ADS智驾方案始终坚持激光雷达毫米波雷达摄像头的多传感器融合路线,行业降本压力下硬件配置从超配逐步转向贴合实际需求,带动整体硬件成本下降。 1)单车传感器数量呈现下降趋势,包括激光雷达从3个减配至1个、毫米波雷达从6R减配至3R、摄像…

【深度学习】GPU版本

我发现nvidia-smi的cuda版本不是我期望镜像中的版本,咨询一下还要选择对应的驱动,比如cuda12.2对应的 {"12.3": "525.60","12.2": "525.60","12.1": "525.60","12.0": "52…

【硬件开发】安规电容X电容和Y电容

为什么有安规电容 国家为了保护人民的安全要求,电容器失效后,不会导致电击,不危及人身安全的安全电容器 安规电容的作用 滤除雷电冲击波,以及插拔插座的高频噪声 X电容 聚酯电容 位置 X电容位于火线和零线之间 作用 滤除…

Swift 中更现代化的调试日志系统趣谈(二)

概述 在上篇 Swift 中更现代化的调试日志系统趣谈(一) 博文中,我们初步讨论了如何利用 Swift OSLog 框架中的 Logger 日志记录器替代“简陋”的 print 方法来记录我们的调试消息。 而接下来我们会再接再厉,继续调试日志系统的进一步介绍。 在本篇博文中,您将学到如下内容…

No module named ‘pytesseract‘

报错解释: 这个错误表示Python无法找到名为pytesseract的模块。pytesseract是一个用于OCR(光学字符识别)的库,它依赖于Google的Tesseract-OCR引擎。这个错误通常发生在尝试使用pytesseract之前未正确安装该模块的情况下。 解决方…

timm中模型更换huggingface模型链接

现在timm默认使用huggingface的链接了,错误链接如下: (MaxRetryError("HTTPSConnectionPool(hosthuggingface.co, port443): Max retries exceeded with url: /timm/swinv2_tiny_window8_256.ms_in1k/resolve/main/model.safetensors (Caused by C…

MySQL:表的内连接和外连接、索引

文章目录 1.内连接2.外连接2.1 左外连接2.2 右外连接 3.综合练习4.索引4.1见一见索引4.2 硬件理解4.3 MySQL 与磁盘交互基本单位(软件理解)4.4 (MySQL选择的数据结构)索引的理解4.5 聚簇索引 VS 非聚簇索引 5.索引操作5.1 创建索引5.2 查询索引5.3 删除索引 1.内连接 内连接实…

Keepalive技术

文章目录 一、Keepalive基础vrrp技术Keepalived介绍Keepalived架构 二、 Keepalived 相关文件配置文件组成全局配置虚拟路由器配置 三、配置lvs和keepalive联动服务器架构抢占模式配置配置单播、组播配置通知模块日志功能脑裂现象 四、keepalived和nginx联动keepalive和其他应用…

OSINT技术情报精选·2024年6月第4周

OSINT技术情报精选2024年6月第4周 2024.6.30版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 1、大数据技术标准推进委员会:《面向人工智能的数据治理(DG4AI)实践指南1.0》 2024年6月19-20日,“来这里,…

嵌入式Linux系统编程 — 5.5 sleep、usleep和nanosleep系统休眠函数

目录 1 为什么需要休眠 2 sleep、usleep和nanosleep函数 2.1 sleep函数 2.2 usleep函数 2.3 nanosleep函数 3 示例程序 1 为什么需要休眠 有时需要将进程暂停或休眠一段时间, 进入休眠状态之后,程序将暂停运行,直到休眠结束。 以下是一…

Is ChatGPT a Good Personality Recognizer? A Preliminary Study?

ChatGPT是一个很好的人格识别者吗?初步调研 摘要1 介绍2 背景和相关工作3 实验3.1 数据集3.2 提示策略3.3 基线3.4 评估指标3.5 实现细节3.6 Overall Performance (RQ1)3.7 ChatGPT在人格识别上的公平性 (RQ2)3.8 ChatGPT对下游任务的人格识别能力(RQ3&a…

javaEE——Servlet

1.web开发概述 所谓web开发,指的是从网页中向后端程序发送请求,与后端程序进行交互 2.java后端开发环境搭建 web后端(javaEE)程序需要运行在服务器中的,这样前端才可以访问得到 3.服务器是什么? ①服务器就是一款软件,可以向其发送请求&#…

如何根据两个关键字查询报错日志的位置

要根据两个关键字查询报错日志的位置,在Linux中,你可以使用grep命令结合正则表达式(regex)来实现。grep命令允许你在文件中搜索匹配特定模式的行。 假设你有两个关键字“keyword1”和“keyword2”,并且你想找到同时包…

教学常用内容

容器 #include<bits/stdc.h> #define fi first #define se second #define pb push_back #define PII pair<int,int > #define int long long #define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);using namespace std;const int N 1e610;vec…

深入解析HDFS:定义、架构、原理、应用场景及常用命令

引言 Hadoop分布式文件系统&#xff08;HDFS&#xff0c;Hadoop Distributed File System&#xff09;是Hadoop框架的核心组件之一&#xff0c;它提供了高可靠性、高可用性和高吞吐量的大规模数据存储和管理能力。本文将从HDFS的定义、架构、工作原理、应用场景以及常用…

【UML用户指南】-24-对高级行为建模-进程和线程

目录 1、概念 2、主动类 3、通信 4、同步 5、常用建模技术 5.1、对多控制流建模 5.2、对进程间通信建模 在UML中&#xff0c;可以将每一个独立的控制流建模为一个主动对象&#xff0c;它代表一个能够启动控制活动的进程或线程。 进程是一个能与其他进程并发执行的重量级…