数据库表的三种关系,通俗易懂的讲解

简介: 本文通俗讲解数据库表的三种核心关系:一对多(如班级与学生)、一对一(加唯一约束的一对多)、多对多(需中间表实现)。含定义、约束规则、SQL示例及图解,助初学者快速掌握关系建模要点。

前言
本文来讲解数据库表的三种关系,旨在帮助读者更好的预习,理解以及复习😊

个人主页:艺杯羹

系列专栏:MySQL

一. 什么是数据库表的关系

数据库表的关系分为三种

关系类型

描述

约束

一对多

一表一条数据对应另一表多条

外键在多方,可重复、有空值

一对一

两表数据一 一对应

外键设唯一约束,先删外键后删主键

多对多

两表对象互成一对多

中间表两列联合主键,分别外键参照主表

二. 一对多关系

一种对象与另一种对象是 一 一 对应关系
一对多关系是建立在两张表之间的关系。一个表中的一条数据可以对应另一个表中的多条数据。
可以添加外键约束保证数据的参照完整性,外键一直都是在多方。
注:外键允许重复,允许含有空值

例如学生表和班级表可以是一个一对多的关系
可以这么理解:一个班级对应着多个学生,就是一对多的关系

实例:  

  1. 创建一个班级表
create table calss_table(
  -- 班级id,并设置为主键和自动增长  
  class_id int primary key auto_increment,
  -- 班级名称  
  calss_name varchar(50) 
);
  1. 创建一个学生表
create table student_table(  
  student_id int primary key auto_increment,
  student_name varchar(50),
  student_class_id,
  -- 对student_class_id设置外键
  -- 链接到 class_table 表中的 calss_id 的主键  
  foreign key(student_class_id) references class_table(class_id)
);

班级表通过外键来和学生表来建立连接

三. 一对一关系

简单来说就是:一种对象与另一种对象是一一对应关系
一对一关系是建立在一对多的基础之上,一个表中的一条数据只能对应另一个表中的一条数据。
那么这不就和唯一约束很类似了吗,所以可以用唯一约束,就更好的维护了参照完整性

tips:如果添加的外键约束,那么删除数据时,一定是先删除有外键一方的数据

还是拿刚刚的学生表和班级表来举例
可以这么理解:
一个学生只能对应一个教室,而一个教室只能对应一个唯一的学生

  1. 创建班级表
create table class_table (
    -- 班级id,作为主键并自动递增
    class_id int primary key auto_increment, 
    -- 班级名称
    class_name varchar(50) 
);
  1. 创建学生表
create table student_table(  
  student_id int primary key auto_increment,
  student_name varchar(50),
  -- 添加unique约束实现一对一
  student_class_id int unique,
  -- 对student_class_id设置外键
  -- 链接到 class_table 表中的 calss_id 的主键  
  foreign key(student_class_id) references class_table(class_id)
);

看到和一对多的区别没,就是在于是否有unique的唯一约束

这里的意思就是,每个学生只能对应一个班级

四. 多对多关系

也就是两个对象彼此都是一对多的关系

这里和前两个关系不同的是,这里需要借助中间表来实现
中间表里建立两个列,然后需要用这两个列作为这个表的联合主键,然后每个列在作为外键参照各自的表的主键
拿学生和课程之间来举例就是:一个学生可以选修多门课程,一个课程能被选择多个学生
实例:  

  1. 创建学生表,课程表,以及中间表
-- 创建学生表
create table students (
    -- 学生id,作为主键,自动递增
    student_id int primary key auto_increment, 
    -- 学生姓名
    student_name varchar(10) 
);
-- 创建课程表
create table courses (
    -- 课程id,作为主键,自动递增
    course_id int primary key auto_increment, 
    -- 课程名称
    course_name varchar(20) 
);
-- 创建中间表
create table student_courses (
    -- 是外键,关联学生表的student_id
    student_id int, 
    -- 是外键,关联课程表的course_id
    course_id int, 
    -- 联合主键
    primary key (student_id, course_id), 
    foreign key (student_id) references students(student_id),
    foreign key (course_id) references courses(course_id)
);
  1. 插入数据并使用中间表来关联
-- 插入学生数据
insert into students (student_name) values ('艺杯羹'), ('小王');
-- 插入课程数据
insert into courses (course_name) values ('C语言'), ('java');
-- 在中间表插入关系数据,表示艺杯羹选了C语言和java,小王选了C语言
insert into student_courses (student_id, course_id) 
values 
(1, 1), (1, 2), (2, 1);

Tips:
插入数据:先插入两张主表的数据,再插入中间表的数据
删除数据:先删除中间表(即有外键的表),再删除两个主表
这就好像是先添加主键,再添加外键
删除:先删除外键数据再删除主键数据

关系图:

五. 总结

希望本文能够帮助到你(* ̄︶ ̄)

目录
相关文章
|
1月前
|
设计模式 Web App开发 人工智能
【AI】Agent 全栈进阶|系统化学习路线专题
描述 Agent 的概念、核心构成,规划出一套循序渐进的 Agent 开发学习路径,从大模型调用、工具调用、RAG、运行模式、记忆机制再到工程化调试,同时附上多款适合入门钻研的开源参考项目
1518 6
|
2月前
|
人工智能
Qwen3.8抢先体验!正式版即将发布并开源!
千问Qwen3.8即将开源,参数达2.4T,进化速度以“天”计,实力媲美Fable 5。预览版Qwen3.8-Max已上线阿里Token Plan等平台,限时优惠:日间Credits低至1折,夜间更优,个人/团队版月付仅35元起!
4370 148
|
1月前
|
人工智能 安全 前端开发
基于 AgentScope 构建金融级智能体底座实战
金融级 AI 原生智能体底座白皮书发布。
|
2月前
|
人工智能 运维 安全
|
17天前
|
前端开发 Java 测试技术
Maven 之工程构建与依赖管理全攻略
本文系统讲解Maven核心知识:涵盖POM/JAR/WAR工程类型与标准目录结构;详解构建生命周期(validate→compile→test→package→install→deploy)及常用命令;深入解析本地/远程/中央仓库机制,并指导配置本地仓库路径、阿里云镜像及JDK版本。内容精炼实用,助开发者快速掌握Maven项目管理精髓。
104 1
Maven 之工程构建与依赖管理全攻略
|
22天前
|
算法 安全 开发工具
Git文件状态管理:从基础到进阶的完整指南
本文详解Git五大文件状态(Untracked/Unmodified/Modified/Staged/Deleted)及其转换逻辑,涵盖状态查看、暂存、提交、删除、忽略配置、差异比较与文件还原等核心操作,助你精准掌控版本控制流程。
100 1
Git文件状态管理:从基础到进阶的完整指南
|
9天前
|
存储 SQL 消息中间件
Agent 做了这么多轮重构,企业到底该留下什么?
本文整理自第 10 届 AI + 研发数字峰会(AiDD)北京站 TOP10 最佳演讲议题之一《Agent 开发范式演进:简化多源实时上下文构建》。
|
16天前
|
人工智能 运维 网络协议
全球分布式研发下的多云大模型治理实践(一):网络与系统底座篇
凌晨两点,Remote-SSH频繁断线,大模型API请求又收到一串陌生的403——问题往往不在代码,而在网络底座。本文分享宝商AI团队在MSP托管运维一线沉淀的跨境研发网络工程化方案:新加坡/东京灰度节点选址、Clean DNS解析层重构、TCP BBR内核级调优,附可量化验收标准,助力全球分布式团队把"总卡顿"变成"零阻断"。
81 1
|
1月前
|
存储 安全 JavaScript
外卖平台上的XSS与CSRF攻防全解析:从一次弹窗到百万蠕虫
本文以一次搜索框弹窗事故为引,系统剖析Web安全核心攻击链:从反射型XSS(用户输入未过滤→恶意脚本执行),到Cookie窃取与CSRF身份盗用,再到存储型XSS(评论区持久化攻击),最终演变为Samy蠕虫的指数级传播。涵盖原理、案例、对比及HTTPOnly、CSP、CSRF Token等实用防御方案。(239字)
242 5
外卖平台上的XSS与CSRF攻防全解析:从一次弹窗到百万蠕虫
|
17天前
|
Java 数据库连接 数据库
MyBatis 之关联查询(一对一、一对多及多对多实现)
本文详解MyBatis关联查询:涵盖一对一(association)、一对多(collection)及多对多(本质为两个一对多)的映射配置与实战示例,含实体设计、XML映射、SQL编写及测试代码,助开发者高效处理表间关系。
83 0
MyBatis 之关联查询(一对一、一对多及多对多实现)

热门文章

最新文章