MySQL 外键使用详解

1、MySQL 外键约束语法

MySQL 支持外键,允许在表之间进行相关数据的交叉引用,并有助于保持相关数据的一致性。

一个外键关系涉及到一个父表,该父表保存初始列值,和一个子表,子表的列值引用父表的列值。外键约束定义在子表上。

定义外键约束的基本语法包括以下部分:

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

其中 reference_option 可以是: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

2、标识符

外键约束命名遵循以下规则:

  • 如果定义了 CONSTRAINT 符号值,则使用该值。
  • 如果未定义 CONSTRAINT 符号子句,或者在 CONSTRAINT 关键字后未包含符号,则会自动生成约束名。
  • 在 MySQL 8.0.16 及更高版本中,如果未定义 CONSTRAINT 符号子句,或者在 CONSTRAINT 关键字后未包含符号,InnoDB 和 NDB 存储引擎将忽略 FOREIGN_KEY index_name。
  • 如果定义了 CONSTRAINT 符号值,它必须在数据库中是唯一的。重复的符号会产生类似于:ERROR 1005 (HY000): Can't create table 'test.fk1' (errno: 121) 的错误。

3、条件和限制

外键约束受到以下条件和限制:

  • 父表和子表必须使用相同的存储引擎,且不能定义为临时表。
  • 创建外键约束需要在父表上具有 REFERENCES 权限。
  • 外键中对应的列和被引用的键必须具有类似的数据类型。固定精度类型如 INTEGER 和 DECIMAL 的大小和符号必须相同。字符串类型的长度不必相同。对于非二进制(字符)字符串列,字符集和排序规则必须相同。
  • MySQL 支持在表内的一列与另一列之间的外键引用(某列不能对自己进行外键引用)。在这些情况下,“子表记录”指的是在同一表中的依赖记录。
  • MySQL 需要在外键和引用键上创建索引,以便外键检查可以快速完成并且不需要扫描表。在引用表中,必须存在一个索引,其中外键列被列为相同顺序的第一列。如果不存在此类索引,则会自动在引用表上创建此索引。如果您稍后创建了另一个可用于强制执行外键约束的索引,则可能会静默删除此索引。如果给出了 index_name,则按照前面的描述使用它。

4、引用操作

当更新或删除操作影响父表中具有在子表中匹配行的键值时,结果取决于 FOREIGN KEY 子句的 ON UPDATE 和 ON DELETE 子句中指定的引用操作。引用操作包括:

  • CASCADE:从父表中删除或更新行,并自动删除或更新子表中的匹配行。支持 ON DELETE CASCADE 和 ON UPDATE CASCADE。在两个表之间,不要为在父表或子表的同一列上起作用的几个 ON UPDATE CASCADE 子句定义几个 ON UPDATE CASCADE 子句。
  • SET NULL:从父表中删除或更新行,并将子表中的外键列或列设置为 NULL。支持 ON DELETE SET NULL 和 ON UPDATE SET NULL 子句。
  • RESTRICT:拒绝对父表的删除或更新操作。指定 RESTRICT(或 NO ACTION)与省略 ON DELETE 或 ON UPDATE 子句相同。
  • NO ACTION:来自标准 SQL 的关键字。对于 InnoDB,这等效于 RESTRICT;如果在引用的表中存在相关外键值,则立即拒绝对父表的删除或更新操作。NDB 支持延迟检查,NO ACTION 指定延迟检查;当使用此选项时,直到提交时间才执行约束检查。注意,对于 NDB 表,这会导致对父表和子表进行的所有外键检查都被推迟。
  • SET DEFAULT:此操作由 MySQL 解析器识别,但 InnoDB 和 NDB 都会以 ON DELETE SET DEFAULT 或 ON UPDATE SET DEFAULT 子句拒绝表定义。

外键检查

从 MySQL 8.0.16 开始,可以使用 FOREIGN_KEY_CHECKS 配置选项来启用或禁用外键约束检查。当该选项设置为 1 或者未指定时,MySQL 将对外键约束进行检查。当该选项被设置为 0 时,MySQL 将禁用所有外键约束检查。

SET FOREIGN_KEY_CHECKS=0;

使用此选项可以大幅度提高含有大量外键约束的数据库表的数据导入速度。

锁定

当执行涉及外键约束的更新、删除或插入操作时,InnoDB 存储引擎会尝试获取必要的行级共享 (S) 锁定。如果无法立即获取这些锁定,InnoDB 可能会产生等待锁定的情况。

外键错误

在操作涉及到外键约束的表时,可能会遇到一些常见的错误,比如:

  • ERROR 1005 (HY000): Can't create table '...' (errno: 150):MySQL 无法创建表,因为外键约束无法正确地创建。这可能是由于数据类型不匹配或者被参照的键不存在。
  • ERROR 1215 (HY000): Cannot add foreign key constraint:MySQL 无法添加外键约束。同样可能是因为数据类型不匹配或者被参照的键不存在。
  • ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails:试图插入或更新一行,但是外键约束失败。这通常意味着你正在尝试插入一个不存在于父表的值。

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

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

相关文章

C++ deque底层原理

deque底层原理 一、目的二、底层实现三、原理图四、类结构五、push_back六、pop_back 一、目的 实现双端数组 二、底层实现 双向开口的连续线性空间 三、原理图 四、类结构 class deque : protected Deque base _Deque_base._Deque_impl M_map 指针数组 _M_map_size …

React笔记(九)RTK

一、RTK的简介 1、官网地址 Redux Toolkit: 概览 | Redux 中文官网 2、Redux toolkit是什么 Redux Toolkit 是 Redux 官方强烈推荐,开箱即用的一个高效的 Redux 开发工具集。它旨在成为标准的 Redux 逻辑开发模式,我们强烈建议你使用它。 它包括几个…

行业追踪,2023-08-29

自动复盘 2023-08-29 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

【原创】H3C路由器OSPF测试

网络拓扑图 路由器配置: 路由器1上接了4跟线,分别为这四个接口配置IP地址。 # interface GigabitEthernet0/0/0port link-mode routecombo enable copperip address 2.1.1.2 255.255.255.0 # interface GigabitEthernet0/0/1port link-mode routecombo…

Linux知识点 -- 网络编程套接字

Linux知识点 – 网络编程套接字 文章目录 Linux知识点 -- 网络编程套接字一、预备知识1.认识端口号2.套接字3.TCP协议与UDP协议4.网络字节序 二、socket编程接口1.socket常见API2.sockaddr结构 三、UDP套接字编程1.直接打印客户端信息2.执行客户端发来的指令3.多用户聊天4.在wi…

ThreadLocal内存泄露分析

目录 1 ThreadLocal快速入门使用2 ThreadLocal内存泄露3 如何避免内存泄露 1 ThreadLocal快速入门使用 ThreadLocal介绍和应用:https://blog.csdn.net/ZGL_cyy/article/details/125958690 2 ThreadLocal内存泄露 如果创建对象较大gc,ThreadLocal是个弱…

Qt QtCreator 所有官方下载地址

Qt QtCreator 所有版本官方下载地址 1.所有版本QT下载地址 : Index of /archive/qt 所有Qt Creator下载地址: Index of /archive/qtcreator 所有Qt VS开发插件下载地址: Index of /archive/vsaddin 4.Qt官网镜像下载地址: Index of /…

HTTP 常⻅的状态码有哪些,以及适⽤场景

⼀、HTTP状态码 HT T P 状态码( HT T P S t a t u s Co d e )是⽤来表示⽹⻚服务器超⽂本传输协议响应状态的 3 位数字代 码。它由 RFC 2 6 1 6 规范定义,并得到 RFC 2 5 1 8 、 RFC 2 8 1 7 、 RFC 2 2 9 5 、 RFC 2 7 7 4 与 RFC 4 9 1 8…

Unity制作下雨中的地面效果

Unity引擎制作下雨效果 大家好,我是阿赵。   之前介绍了Unity引擎里面通过UV偏移做序列帧动画的做法,这里再介绍一个进阶的用法,模拟地面下雨的雨点效果。 一、原理 最基本的原理,还是基于这个序列帧动画的做法。不过这里做一点…

关于使用RT-Thread系统读取stm32的adc无法连续转换的问题解决

关于使用RT-Thread系统读取stm32的adc无法连续转换的问题解决 今天发现rt系统的adc有一个缺陷(也可能是我移植的方法有问题,这就不得而知了!),就是只能单次转换,事情是这样的: 我在stm32的RT-T…

Ubuntu tmux 默认安装 快捷键

安装 sudo apt install tmux 启动tmux tmux 注意下方已显示[0] 0:bash 左右分屏 依次输入两组快捷键:Ctrlb, Shift5 即:% 上下分屏 依次输入两组快捷键:Ctrlb, Shift 即:" 切换窗口(注意:鼠标点击没有切换效果&#x…

【USRP】产品型号、参数、架构全解析系列 6:N320 / N321

一、USRP 简介 通用软件无线电外设( USRP ) 是由 Ettus Research 及其母公司National Instruments设计和销售的一系列软件定义无线电。USRP 产品系列由Matt Ettus领导的团队开发,被研究实验室、大学和业余爱好者广泛使用。 大多数 USRP 通过以太网线连接到主机&am…

Ubutnu python2与python3切换

python -V #查看默认版本 Python 2.7.17 python3 -V #查看电脑3的版本 Python 3.6.9 sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2 #设置两个版本的…

Emmet 使用笔记小结

Emmet 使用笔记小结 最近在跟视频走 CSS 的教程,然后要写很多的 HTML 结构,就想着总结一下 Emmet 的语法。 Emmet 是一个工具可以用来加速 HTML 和 CSS 的开发过程,不过 emmet 只支持 HTML & XML 文件结构,所以我个人觉得对…

【每日一题】54. 螺旋矩阵

54. 螺旋矩阵 - 力扣(LeetCode) 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5…

基于springboot实现了后台定时统计数据报表并将数据生成excel文件作为附件,然后通过邮件发送通知的功能

概述 本例子基于springboot实现了后台定时统计数据报表并将数据生成excel文件作为附件,然后通过邮件发送通知的功能。 详细 一、准备工作 1、首先注册两个邮箱,一个发送邮箱,一个接收邮箱。 2、发送邮箱开启IMAP/SMTP/POP3服务&#xff0c…

【面试题精讲】MySQL中覆盖索引是什么

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 在MySQL中,覆盖索引是一种特殊类型的索引,它包含了查询所需的所有列,而不仅仅是索引列…

【Css】Less和Sass的区别:

文章目录 一、定义:【1】Less【2】Sass 二、相同之处:三、区别:【1】实现方式:【2】实现方式:【3】混合(Mixins):【4】解析方式:【5】变量的作用域:【6】比起Less 一、定义: 【1】Less Less 是…

MATLAB 2022b 中设置关闭 MATLAB 之前进行询问

在 MATLAB 2022b 中可以进行设置,在关闭 MATLAB 之前进行询问,防止意外关闭 MATLAB。如图:

解决IDEA中java的system.properties乱码问题

在拉了别人的代码到本地后发现system.properties中中文注释都变成了乱码,故记录下解决步骤,供参考,我的系统是mac系统 1、在IDEA中打开设置,IDEA--->Preferences 2、点击Editor-->File Encodings 3、图中三处选择UTF-8&…