【MySQL】多表操作 —— 外键约束

news2025/3/18 3:37:48

目录

  • 多表关系
    • 一对一关系
    • 一对多/多对一关系
    • 多对多关系
  • 外键约束
    • 基本概念
    • 一对多/多对一
      • 创建外键约束
      • 外键约束下的数据操作
        • 数据插入
        • 数据删除
      • 删除外键约束
    • 多对多
      • 创建外键约束
      • 外键约束下的数据操作
        • 数据插入
        • 数据删除
      • 删除外键约束

多表关系

MySQL 多表之间的关系可以概括为:

  • 一对一
  • 一对多/多对一
  • 多对多

一对一关系

例子:一个学生只有一张身份证,一张身份证只能对应一学生

在任一表中添加唯一外键,指向另一方主键,确保一对一关系

一般一对一关系较少见,遇到一对一关系的表最好是合并表

在这里插入图片描述

一对多/多对一关系

例子:一个部门有多个员工,一个员工只能对应一个部门

实现原则:在多的一方建立外键,指向一的一方的主键

在这里插入图片描述

多对多关系

例子:一个学生可以选择很多门课,一门课也可以被很多学生选择

原则:多对多关系实现需要借助第三张中间表,中间表至少包含两个字段,将多对多的关系,拆成一对多的关系,中间表至少要有两个外键,这两个外键分别指向原来两张表的主键

在这里插入图片描述

外键约束

基本概念

MySQL 外键约束(foreign key)是表的一个特殊字段,经常与主键一起使用,对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)

外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。比如,一个水果摊,只有苹果、桃子、李子、西瓜这 4 种水果,那么来到水果摊买水果就只能选择苹果、桃子、李子、西瓜,其他水果无法购买

在这里插入图片描述

定义一个外键时,需要遵守下列规则:

  • 主表必须已经存在于数据库中,或者是当前正在创建的表
  • 必须为主表定义主键
  • 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的
  • 在主表的表名后面指定列名或列名的组合,这个列或列的组合必须是主表的主键或候选键。
  • 外键中列的数目必须和主表的主键中列的数目相同
  • 外键中列的数据类型必须和主表主键中对应列的数据类型相同

一对多/多对一

创建外键约束

方式 1:创建表时设置

在 create table 语句中,通过 foreign key 关键字来指定外键

格式如下:

[constraint 外键名] foreign key (外键字段名[,外键字段名2,...]) references 主表名(主键字段名[,主键字段名2,...])

代码示例:

create table if not exists dept(
    deptno varchar(20) primary key , -- 部门号
    name varchar(20) -- 部门名称
);
create table if not exists emp(
    eid varchar(20) primary key , -- 员工编号
    ename varchar(20) , -- 员工名字
    age int , -- 员工年龄
    dept_id varchar(20) , -- 员工所属部门
    constraint emp_fk foreign key (dept_id) references dept(deptno)
);

结果如下:

在这里插入图片描述

方式 2:创建表后设置

外键约束也可以在修改表时添加,但是添加外键约束的前提是:从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据

格式如下:

alter table 从表名 add constraint 外键名 foreign key (外键字段名) references 主表名(主键字段名)

代码示例:

create table if not exists dept(
    deptno varchar(20) primary key , -- 部门号
    name varchar(20) -- 部门名称
);
create table if not exists emp(
    eid varchar(20) primary key , -- 员工编号
    ename varchar(20) , -- 员工名字
    age int , -- 员工年龄
    dept_id varchar(20) -- 员工所属部门
);
alter table emp add constraint dept_fk foreign key (dept_id) references dept(deptno);

结果如下:

在这里插入图片描述

外键约束下的数据操作

数据插入

代码示例:

insert into dept values ('1001','研发部'),
                        ('1002','销售部');
insert into emp values ('1','张三',20,'1001'),
                       ('2','李四',20,'1001'),
                       ('3','王五',21,'1002'),
                       ('4','赵六',22,'1002'),
                       ('5','孙七',24,'1003');

结果如下:

在这里插入图片描述

由于 emp 表的外键列插入了 dept 表主键列中没有的数据,导致报错

注意事项:

  • 必须先给主表添加数据
  • 从表添加数据时,外键列的值不能随便写,必须依赖主表的主键列
数据删除

代码示例:

delete from dept where deptno = '1001';

结果如下:

在这里插入图片描述

由于 dept 表中主键列中的 1001 被 emp 表中的外键列依赖,所以删除会报错

注意事项:

  • 删除表要先删除从表才能删除主表

  • 主表的数据被从表依赖时,不能删除,没有被依赖的数据则可以删除

  • 从表的数据可以随便删除

删除外键约束

当一个表中不需要外键约束时,就需要从表中将其删除,外键一旦删除,就会解除主表和从表间的关联关系

格式如下:

alter table 从表名 drop foreign key 外键约束名;

代码示例:

alter table emp drop foreign key dept_fk;

结果如下:

在这里插入图片描述

多对多

在多对多关系中,A 表的一行对应 B 表的多行,B 表的一行对应 A 表的多行,需要新增加一个中间表,来建立多对多关系

在这里插入图片描述

student 表和 course 表都是主表,student_course 表是从表,也就是说,在多对多关系中,可以有多个主表

创建外键约束

从表对每个主表都设置一个外键约束

代码示例:

create table if not exists student(
    sid int primary key auto_increment, -- 学生学号
    name varchar(20), -- 学生姓名
    age int -- 学生年龄
);
create table if not exists course(
    cid int primary key auto_increment, -- 课程编号
    cname varchar(20) -- 课程名
);
create table if not exists student_course(
    sid int ,
    cid int,
    score double -- 分数
);
alter table student_course add foreign key (sid) references student(sid);
alter table student_course add foreign key (cid) references course(cid);

结果如下:

在这里插入图片描述

外键约束下的数据操作

多对多中的外键约束其实跟一对多/多对一中的外键约束没什么区别,这里就直接给出正确代码

数据插入

代码示例:

insert into student values (1,'张三',20),(2,'李四',20);
insert into course values (001,'语文'),(002,'数学'),(003,'英语');
insert into student_course values (1,001,99),
                                  (2,001,97),
                                  (1,002,100),
                                  (2,002,90),
                                  (1,003,79),
                                  (2,003,99);

结果如下:

在这里插入图片描述

注意事项:

  • 必须先给主表添加数据
  • 从表添加数据时,外键列的值不能随便写,必须依赖主表的主键列
数据删除

代码示例:

delete from student_course;

结果如下:

在这里插入图片描述

注意事项:

  • 删除表要先删除从表才能删除主表

  • 主表的数据被从表依赖时,不能删除,没有被依赖的数据则可以删除

  • 从表的数据可以随便删除

删除外键约束

代码示例:

alter table student_course drop foreign key student_course_ibfk_1;
alter table student_course drop foreign key student_course_ibfk_2;

结果如下:

在这里插入图片描述

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

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

相关文章

从被动响应到主动预见:智能可观测性技术的变革与实践

思维导图 一、引言 🌃 想象一下,在一个深夜 🌙,你的关键业务系统突然出现故障 🚨。传统情况下,你可能会收到大量不相关的告警 📱💬💬💬,然后花费数小时甚至数天时间 ⏳,在错综复杂的系统架构中寻找根本原因 🔍。而在智能可观测性的世界里,故障发生前系统…

【GPT入门】第22课 langchain LCEL介绍

【GPT入门】第22课 langchain LCEL介绍 1. LCEL介绍与特点2. 原生API与LCEL的对比2. 简单demo 1. LCEL介绍与特点 LCEL 即 LangChain Expression Language,是 LangChain 推出的一种声明式语言,用于简化和优化在 LangChain 框架内构建复杂链和应用的过程…

7、基于osg引擎实现读取vtk数据通过着色器实现简单体渲染(1)

基于光线投射原理实现的体渲染 一、什么是体绘制?二、为什么不直接用3D模型渲染三、原理及部分代码解析1、什么是光线?2、什么是光线投射?3、为什么需要光线投射3D纹理?4、为什么必须是3D纹理?5、为什么还需要1D纹理&a…

在 Windows 上使用 choco 安装 mkcert 并配置 Vue 运行HTTPS

解决在Windows上使用Vue本地运行HTTPS的问题,vue-cli或vite都可以使用 步骤 1:确认 Chocolatey 是否已安装 1. 检查 choco 命令是否可用 打开 PowerShell(管理员权限),输入: choco -v如果显示版本号(如…

spring声明式事务原理01-调用第1层@Transactional方法(事务访问入口)

文章目录 【README】【步骤1】UserAppService调用userSupport.saveNewUser()【步骤2】获取到TransactionInterceptor【步骤3】chain不为空,接着执行CglibMethodInvocation#proceed方法【补充】AopContext作用 【步骤4】CglibMethodInvocation#proceed方法【步骤5】调…

Qt-D指针与Q指针的设计哲学

文章目录 前言PIMLP与二进制兼容性D指针Q指针优化d指针继承Q_D和Q_Q 前言 在探索Qt源码的过程中会看到类的成员有一个d指针,d指针类型是一个private的类,这种设计模式称为PIMPL(pointer to implementation),本文根据Q…

数据结构——单链表list

前言:大家好😍,本文主要介绍数据结构——单链表 目录 一、单链表 二、使用步骤 1.结构体定义 2.初始化 3.插入 3.1 头插 3.2 尾插 3.3 按位置插 四.删除 4.1头删 4.2 尾删 4.3 按位置删 4.4按值删 五 统计有效值个数 六 销毁…

基于PHP的网店进销存管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 相比于以前的传统进销存管理方式,智能化的管理方式可以大幅降低进销存管理的运营人员成本,实现了进销存管理的标准化、制度化、程序化的管理,有效地防止了商品信息及仓库信息的随意管理,提高了信息的处理速度和精确度&#…

Vue3 Pinia $subscribe localStorage的用法 Store的组合式写法

Vue3 Pinia $subscribe 可以用来监视Stroe数据的变化 localStorage的用法 localStorage中只能存字符串,所有对象要选转成json字符串 定义store时,从localStorage中读取数据talkList可能是字符串也可能是空数组 Store的组合式写法 直接使用reactiv…

【PHP】获取PHP-FPM的状态信息

文章目录 一、前言二、环境三、过程1)修改PHP-FPM配置文件2)修改Nginx配置文件3)访问页面4)修改状态页面端口 一、前言 PHP-FPM内置有一个状态页面,通过这个页面可以获取到FPM的一些状态信息(见下图&#…

(性能测试)性能测试工具 2.jmeter的环境搭建 3jmeter元件和4使用实例 5jmeter元件和参数化

目录 性能测试工具 性能测试工具 jemeter环境搭建 jmeter的常用目录介绍 jmeter修改语言和主题--jmeter界面的汉化 jmeter元件 jmeter元件和组件的介绍 jmeter的作用域原则 jmeter的执行顺序 案例:执行顺序 jmeter使用案例 jmeter线程组的介绍 jmeter…

Java 大视界 -- 基于 Java 的大数据实时流处理中的窗口操作与时间语义详解(135)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

数据库的基本知识

目录 一、创建数据库和数据表1.1 创建数据库相关代码1.2 创建数据表1.3 约束条件1.3.1 主键约束1.3.2 非空约束1.3.3 唯一性约束1.3.4 默认约束1.3.5 自增字段 1.4 手工建表 二、数据查询功能2.1 sql 查询的7个关键词2.1.1 select2.1.2 from2.1.3 where2.1.4 group by2.1.5 hav…

失败的面试经历(ʘ̥∧ʘ̥)

一.面向对象的三大特性 1.封装:将对象内部的属性私有化,外部对象不能够直接访问,但是可以提供一些可以使外部对象操作内部属性的方法。 2.继承:类与类之间会有一些相似之处,但也会有一些异处,使得他们与众…

Android 7 及以上夜神模拟器,Fiddler 抓 https 包

文章目录 问题描述解决方案环境准备操作步骤1、导出 Fiddler 证书并修改成 .pem 和 .0 文件2、修改夜神模拟器配置3、打开夜神模拟器设备的 USB 调试选项4、将0725b47c.0证书放入夜神模拟器系统证书目录5、夜神模拟器 cmd 环境配置6、给 0725b47c.0 证书赋予权限7、打开 fiddle…

全国医院数据可视化分析系统

【大数据】全国医院数据可视化分析系统 (完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 🏥 项目名:医疗导航神器!——《基于大数据的微医挂号网医院数据可视…

音视频入门基础:RTCP专题(1)——RTCP官方文档下载

一、引言 实时传输控制协议(Real-time Transport Control Protocol或RTP Control Protocol或简写RTCP)是实时传输协议(RTP)的一个姐妹协议。RTCP由《RFC 3550》定义(取代废弃的《RFC 1889》)。RTP使用一个…

蓝桥杯专项复习——结构体、输入输出

目录 结构体&#xff1a;排序 输入输出 结构体&#xff1a;排序 [NOIP2007]奖学金 #include<iostream> #include<cstring> #include<algorithm>using namespace std;const int N310; int n;struct Student {int chinese,math,eng,sum;int idx; }Stu[N];//定…

工作记录 2017-01-06

工作记录 2017-01-06 序号 工作 相关人员 1 协助BPO进行Billing的工作。 修改CSV、EDI837的导入。 修改邮件上的问题。 更新RD服务器。 郝 修改的问题&#xff1a; 1、 In “Full Job Summary” (patient info.), sometime, the Visit->Facility is missed, then …

LLM(2):准备构建 LLM

在了解大语言模型一文中&#xff0c;对 LLM 做了初步介绍&#xff0c;本文接续前一篇文章的内容&#xff0c;简要介绍 LLM 的应用和构建过程。 1.2 LLM 的应用 由于大型语言模型&#xff08;LLMs&#xff09;在解析和理解非结构化文本数据方面具备先进能力&#xff0c;它们在…