【MySQL入门指南】外键约束使用详解

news2024/11/27 14:42:17

一、为什么需要外键?

 MySQL是一种关系型数据库,现实中的业务往往是相互关联的,这也就决定了数据库中的表也是存在相互关系的。而表与表之间的相互关系就是通过外键来维护的。给大家举一个现实的例子来帮助理解:

 现在我们需要在数据库中存放学生的选课信息。如果我们将课程具体信息全部设计在学生选课表后面,那就会出现大量的数据冗余:

image-20230428155753128

 所以我们不妨在学生选课表中只存放课程的id,课程的具体信息再由id从课程信息表中检索即可,也就是说,我们要建立 stu.course_idcourse.id 的映射关系。

image-20230428155835387

 至此,我们看似实现了“外键”,通过id建立了两张表的关系,但我们没有建立外键约束。怎么理解呢?

  • 管理员向stu表中插入数据时,由于误操作可能插入一个不存在的 course_id
  • C++课程突然从course数据表中被删除了,但stu表中还有选这门课的学生

 上面的两种情况都会导致错误关系的建立。也就是说,我们虽然看似实现了语义上的外键,但是两张表在本质上还是独立的。因此需要由MySQL来维护一种“强制的”,可靠的外键约束。

2.外键的设置

foreign key (字段名) references 主表()

 外键用于定义主表和从表之间的关系。外键约束主要定义在从表上,主表则必须是有主键约束或唯一键约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。在上面的案例中,stu表就属于从表,course表属于主表。

  • 创建主表

    mysql> create table course(
        -> id int primary key,
        -> name varchar(20) not null,
        -> time varchar(64) not null
        -> );
    Query OK, 0 rows affected (0.02 sec)
    
  • 创建从表

    mysql> create table stu(
        -> id int primary key,
        -> name varchar(10) not null,
        -> course_id int,
        -> foreign key(course_id) references course(id) -- 设置外键
        -> );
    Query OK, 0 rows affected (0.05 sec)
    
  • 正常插入数据

    mysql> insert into course values(11, 'C++', '9:00am');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into stu values(100, '张三', 11);
    Query OK, 1 row affected (0.00 sec)
    
  • 插入的课程不存在。在外键约束下插入失败

    mysql> insert into stu values(101, '李四', 12);
    ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`db`.`stu`, CONSTRAINT `stu_ibfk_1` FOREIGN KEY (`course_id`) REFERENCES `course` (`id`))
    
  • 允许插入的值为NULL,表示还没有选课

    mysql> insert into stu values(101, '李四', NULL);
    Query OK, 1 row affected (0.00 sec)
    
  • 在外键约束下删除课程失败,因为还有学生选这门课程

    mysql> delete from course where id=11;
    ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`db`.`stu`, CONSTRAINT `stu_ibfk_1` FOREIGN KEY (`course_id`) REFERENCES `course` (`id`))
    

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

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

相关文章

IPsec中IKE与ISAKMP过程分析(主模式-消息1)

IPsec协议族中IKE(Internet Key Exchange)是一种基于ISAKMP的协议,它为建立IPSec安全通信隧道提供了一种无痕密钥交换的机制。简单来说,IKE就是ISAKMP的扩展,为ISAKMP提供了更加高效、灵活和安全的密钥协商机制。 GMT …

什么是大数据?如何入门学习大数据?

什么是大数据?在互联网技术快速发展的今天,大量日常生活和经营活动中产生的数据都已经信息化。我们产生的数据量相比以前有了爆炸式的增长,传统的数据处理技术已经无法胜任,需求催生技术,一套用来处理海量数据的软件工…

TCP报文结构以及三次握手以及四次握手

源端口号: 目标端口号:用来标识接收方计算机的具体应用进程 序号:发送数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。例如:一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序…

vmware安装redhat 8

vmware安装redhat 8 1、下载镜像文件1.1 镜像文件 2、安装系统2.1、选择自定义安装2.2、兼容性选择2.3、选择镜像文件导入2.4、设置用户名密码2.5、选择虚拟机在磁盘上的位置2.6、选择处理器数量2.7、选择内存大小2.8、选择桥接或NAT2.9、选择SCSI控制器类型2.10、选择虚拟机磁…

第十二章 Transform组件(下)

上一章节中我们介绍了Transform组件的属性和方法。我们发现 Transform 中有right,up和forward,而 Vector3 类中也有right,up和forward,他们是一回事嘛?我们使用Forward来说明两者之间的区别。我们知道,改变…

【web基础】html常用标签+作品展示

前言 小亭子正在努力的学习编程,接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟,如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话,烦请点赞关注支持一波, 感激不尽~~ 说明:此部分是java web基础知识&a…

Python游戏利器pygame,疯狂赛车(34)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 欢迎和猫妹一起,趣味学Python。 今日主题 你玩过游戏吗? 你喜欢玩游戏吗? 手机游戏,电脑游戏,还是游戏机游戏…

java基础入门-02

Java基础入门-02 8、面向对象8.1. 类和对象8.1.1 类和对象的理解8.1.2 类的定义8.1.3 对象的使用8.1.4 学生对象-练习 8.2. 对象内存图8.2.1 单个对象内存图8.2.2 多个对象内存图 8.3. 成员变量和局部变量8.3.1 成员变量和局部变量的区别 8.4. 封装8.4.1 封装思想8.4.2 private…

智能网联汽车城市化的进程和思考

4月19日,工信部官网显示,支持湖北(襄阳)、浙江(德清)、广西(柳州)创建国家级车联网先导区。至此,车联网国家级先导区正式扩容,由4个增至7个。智能网联作为新生…

Qt5.9学习笔记-事件(一)

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三…

哪些问题是ChatGPT不会回答我的?

哪些问题是ChatGPT不会回答我的? 文章目录 哪些问题是ChatGPT不会回答我的?前言ChatGPT擅长回答哪些问题呢?结语 前言 对于chatgpt,人们或许会觉得无论什么问题,它都能够答复,但对于以下这些问题&#xff…

云和恩墨荣获2023数字中国创新大赛·信创赛道“最具发展潜力奖”等4个奖项

4月27日,作为2023数字中国创新大赛信创赛道系列活动之一的“信创与开源技术论坛”在福州召开,信创赛道全国总决赛颁奖仪式在该论坛上举行。云和恩墨的参赛作品“安稳易用的企业级国产数据库 - MogDB”经过层层筛选、角逐,最终荣获“信创赛道最…

2023五一数学建模竞赛选题人数公布

数据来源自,各个平台人数投票统计,仅供参考。 具体数值比例为: 题号人数A504B1174C1905 目前,五一数模竞赛C题半成品论文基本完成制作(累计35页,10000字),注:蓝色字体…

面向画布(Canvas)的JavaScript库

面向画布(Canvas)的JavaScript库 总结 每个库各有特色,根据需求选择 学习要点 面向画布(Canvas)的JavaScript库 EaselJS 是一个封装了 HTML5 画布(Canvas) 元素的 JavaScript 库。jCanvaScript面向HTML5画布(canvas)的Javascript类库&…

【C++】switch 语句

1、缘起 最近在 BiliBili 黑马程序员学习 C 编程语言,今天学习到了 switch 语句。为了加强记忆,所以就写了一篇关于 switch 语句的博客。 switch 语句是 C 中的一种流程控制语句,它可以根据变量的值来执行不同的代码块。这种语句通常用于替代…

《LearnUE——基础指南:上篇—0》——UE架构

UE架构 给我一个UObject,我可以翘起整个UE 思考:如果让我们自己来设计一款3D渲染引擎,你会怎么设计整个架构? 目前,市面上有众多的3D游戏引擎和各种三维渲染引擎,像常见的渲染库OpenGL,WebGL&…

垃圾邮件、欺骗和网络钓鱼,如何防止电子邮件安全意识的威胁

网络安全意识月已过半,本周我们的重点是电子邮件安全意识。 在我们最近为此活动撰写的一篇博客中,我们介绍了电子邮件系统面临的一些最严重的危险——包括垃圾邮件、欺骗和网络钓鱼——以及用户如何主动在他们的电子邮件中发现这些攻击并采取措施避免它…

【Python】如此轻松就能PDF和word互转?【详细教程来啦】

文章目录 前言一、pdf2docx功能二、限制三、安装四、案例总结 前言 可将 PDF 转换成 docx 文件的 Python 库。该项目通过 PyMuPDF 库提取 PDF 文件中的数据,然后采用 python-docx 库解析内容的布局、段落、图片、表格等,最后自动生成 docx 文件。 一、…

A-star算法自学

搜索过程 广度优先搜索(BFS)算法与Dijsktra算法的结合,可以得出最短的路径。 将地图信息通过划分为方形或者其他多边形格子的方法进行表示,便于利用二维数组存放地图信息,每个格子有可行和不可行两种状态;…

[Python图像处理] 小波变换执行图像融合

小波变换执行图像融合 图像融合基础使用小波变换执行图像融合图像融合相关链接 图像融合基础 图像融合是将多个输入图像组合到单个输出图像中的过程,输出图像中包含比单个输入图像更好的场景描述。一个好的图像融合方法应当具备以下属性: 它可以保留不…