数据库表关系详解:一对一、一对多、多对多

文章目录

文章作者:当战神遇到编程

文章专栏:MySQL

欢迎大家点赞👍评论📝收藏⭐文章


表与表之间常见有 三种关系类型:

一对一(1 : 1)

一对多(1 : N)

多对多(M : N)

一: 一对一

含义:

一张表中的一条记录,只对应另一张表中的一条记录。

示例:

用户表 与 用户详情表

user(用户表)

id username
1 张三

user_info(详情表)

user_id 身份证号 地址
1 xxx 北京

说明:

  • 一个用户只有一份详情
  • 一份详情只属于一个用户

一对一 (1:1) 实现代码

核心要点 : 在从表的外键上添加 UNIQUE 约束,确保一个主表记录只能被引用一次。

sql 复制代码
-- 1. 创建用户主表
CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(20)
);

-- 2. 创建用户详情表
CREATE TABLE user_info (
    -- user_id 既是外键,也必须是唯一的,从而实现 1:1
    user_id INT UNIQUE, 
    id_card VARCHAR(18),
    address VARCHAR(100),
    -- 建立外键关联
    FOREIGN KEY (user_id) REFERENCES user(id)
);

二、一对多(1 : N)

含义:

一张表中的一条记录,对应另一张表中的多条记录。

示例:

学院表 与 学生表

college(学院表)

id 学院名
1 计算机学院

student(学生表)

id 姓名 college_id
1001 张三 1
1002 李四 1

说明:

  • 一个学院有多个学生
  • 一个学生只属于一个学院

一对多 (1:N) 实现代码

核心要点: 外键直接建立在"多"的一方(学生表)即可,不需要加 UNIQUE。

sql 复制代码
-- 1. 创建学院表 (一)
CREATE TABLE college (
    id INT PRIMARY KEY AUTO_INCREMENT,
    college_name VARCHAR(20)
);

-- 2. 创建学生表 (多)
CREATE TABLE student (
    id INT PRIMARY KEY AUTO_INCREMENT,
    student_name VARCHAR(10),
    college_id INT, -- 外键列
    -- 多个学生可以关联同一个学院ID
    FOREIGN KEY (college_id) REFERENCES college(id)
);

三、多对多(M : N)

含义:

两张表中的多条记录彼此对应多条记录。

示例:

学生表 与 课程表

  • 一个学生可选多门课
  • 一门课可被多个学生选

student

id 姓名

course

id 课程名

student_course(中间表)

student_id course_id
1001 C01
1001 C02
1002 C01

多对多 (M:N) 实现代码

核心要点: 必须创建一个独立的中间表,用来存放两个表的主键关联。

sql 复制代码
-- 1. 创建学生表
CREATE TABLE student (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(10)
);

-- 2. 创建课程表
CREATE TABLE course (
    id VARCHAR(10) PRIMARY KEY,
    course_name VARCHAR(20)
);

-- 3. 创建中间表 (选课表)
CREATE TABLE student_course (
    student_id INT,
    course_id VARCHAR(10),
    -- 建议:将两个外键设为联合主键,防止同一个学生重复选同一门课
    PRIMARY KEY (student_id, course_id),
    -- 分别建立外键关联
    FOREIGN KEY (student_id) REFERENCES student(id),
    FOREIGN KEY (course_id) REFERENCES course(id)
);

四、关系总结

关系类型 举例 实现方式
一对一 用户-详情 外键 + 唯一约束
一对多 学院-学生 多方加外键
多对多 学生-课程 建中间表

五、面试高频问题

问:为什么多对多要拆中间表?

关系型数据库无法直接表示多对多关系,需要通过第三张表拆解成两个一对多关系。

问:最常见的是哪种关系?

一对多最常见,例如部门与员工、分类与商品、用户与订单。

六:最终总结

表关系本质就是:通过主键和外键,让多张表协同存储数据,避免冗余,提高维护性。

相关推荐
数据最前线5 分钟前
雪上加霜,Oracle向蓝色巨人最后的阵地发起挑战
数据库·oracle
于眠牧北25 分钟前
Charles配置指定域名抓取和雷电模拟器中抓取APP接口配置
数据库·redis·缓存
福娃筱欢42 分钟前
57014 canceling statement due to user request(金仓 KingbaseES)
数据库·kingbase·金仓数据库
ClouGence1 小时前
SAP HANA 数据同步遇到长事务,如何兼顾实时性与完整性?
数据库·后端
数据库小学妹1 小时前
数据库管理工具有哪些?2026主流工具分类与选型对照
数据库·数据库管理工具·数据库工具·信创数据库·数据库客户端
bingHHB1 小时前
销售订单同步实战:MES生产领料/补料→金蝶材料出库
数据库·集成测试
yexianglunbai1 小时前
冷备份与热备份的区别详解
数据库
ZhengEnCi1 小时前
SQL 与 NoSQL 本质差异完全指南:从数据模型到选型决策的深度剖析
数据库
龙腾AI白云1 小时前
数字孪生:与人工智能融合的技术图景
大数据·数据库·人工智能·知识图谱
夜雪一千2 小时前
MySQL中修改JSON类型的数据实战
数据库·mysql·json