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

简介: 本文通俗讲解数据库表的三种核心关系:一对多(如班级与学生)、一对一(加唯一约束的一对多)、多对多(需中间表实现)。含定义、约束规则、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:
插入数据:先插入两张主表的数据,再插入中间表的数据
删除数据:先删除中间表(即有外键的表),再删除两个主表
这就好像是先添加主键,再添加外键
删除:先删除外键数据再删除主键数据

关系图:

五. 总结

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

目录
相关文章
|
2月前
|
设计模式 Web App开发 人工智能
【AI】Agent 全栈进阶|系统化学习路线专题
描述 Agent 的概念、核心构成,规划出一套循序渐进的 Agent 开发学习路径,从大模型调用、工具调用、RAG、运行模式、记忆机制再到工程化调试,同时附上多款适合入门钻研的开源参考项目
2079 7
|
存储 缓存 网络协议
深入理解Linux网络——内核是如何接收到网络包的
一、相关实际问题 RingBuffer是什么,为什么会丢包 网络相关的硬中断、软中断是什么 Linux里的ksoftirqd内核线程是干什么
|
3月前
|
人工智能
Qwen3.8抢先体验!正式版即将发布并开源!
千问Qwen3.8即将开源,参数达2.4T,进化速度以“天”计,实力媲美Fable 5。预览版Qwen3.8-Max已上线阿里Token Plan等平台,限时优惠:日间Credits低至1折,夜间更优,个人/团队版月付仅35元起!
5463 163
|
2月前
|
人工智能 JSON 自然语言处理
Vibe Coding实战:从零构建网页3D交互角色
本文详解Vibe Coding(氛围编程)在网页3D开发中的实践:以“2D→3D→网页”标准化流程为核心,结合腾讯混元3D生成高质量可动画模型,再用Three.js嵌入GLB文件实现交互式渲染,并提供完整代码、提示词模板及八大常见坑点解决方案,助力零基础快速落地3D网页应用。
314 0
Vibe Coding实战:从零构建网页3D交互角色
|
2月前
|
人工智能 自然语言处理 安全
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
本文聚焦阿里云2026年推出的三款自研AI办公产品,清晰拆解千问办公、Qoder Teams、Qoder CN的差异化定位与能力边界:千问办公主打职场全场景提效,支持自然语言指令一键完成PPT生成、数据分析等高频办公任务;Qoder Teams面向程序员团队,深度整合AI代码生成、团队协同与企业知识库能力;Qoder CN则专为金融、政务等强合规场景打造,实现数据不出境与VPC私有化部署。文章同步给出分场景选型指南与最新活动定价,帮助不同类型的企业按需组合产品,实现业务岗、研发岗与强合规场景的AI能力全覆盖。
4598 5
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
|
16天前
|
弹性计算 缓存 运维
阿里云上跑 dsh-free-search 的四条收敛实践
dsh-free-search 是阿里云ECS上轻量部署的多引擎搜索插件,支持Bing等免费引擎及百度、豆包等额度型引擎,通过引擎分层、出网收敛、凭据集中与数据边界管控,实现低成本、高可控的长期稳定运行。(239字)
115 2
|
1月前
|
存储 SQL 消息中间件
Agent 做了这么多轮重构,企业到底该留下什么?
本文整理自第 10 届 AI + 研发数字峰会(AiDD)北京站 TOP10 最佳演讲议题之一《Agent 开发范式演进:简化多源实时上下文构建》。
203 14
|
2月前
|
算法 安全 开发工具
Git文件状态管理:从基础到进阶的完整指南
本文详解Git五大文件状态(Untracked/Unmodified/Modified/Staged/Deleted)及其转换逻辑,涵盖状态查看、暂存、提交、删除、忽略配置、差异比较与文件还原等核心操作,助你精准掌控版本控制流程。
139 1
Git文件状态管理:从基础到进阶的完整指南
|
2月前
|
网络协议 前端开发 JavaScript
HTTP协议初认识、速了解
系统讲解HTTP定义、特点(无状态、无连接、灵活等)、版本演进(HTTP/1.0→1.1→2.0对比),以及URI/URL/URN区别和请求流程,适合初学者快速掌握核心概念。
1826 0
HTTP协议初认识、速了解
|
2月前
|
存储 供应链 安全
数据勒索攻击下数字货运平台安全风险研究 —— 以 Uber Freight 事件为例
本文以Uber Freight遭Helix黑客组织数据勒索事件为案例,剖析数字货运平台面临“业务正常、数据静默窃取”的新型威胁。指出其云环境权限松散、社会工程防御薄弱、事件响应预案缺失等短板,并从认知更新、技术防护、制度建设、应急处置与供应链协同五方面提出治理路径。(239字)
88 1

热门文章

最新文章