文章目录
- [一: 一对一](#一: 一对一)
- [二、一对多(1 : N)](#二、一对多(1 : N))
- [三、多对多(M : N)](#三、多对多(M : N))
- 四、关系总结
- 五、面试高频问题
- 六:最终总结

文章作者:当战神遇到编程
文章专栏: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)
);
四、关系总结
| 关系类型 | 举例 | 实现方式 |
|---|---|---|
| 一对一 | 用户-详情 | 外键 + 唯一约束 |
| 一对多 | 学院-学生 | 多方加外键 |
| 多对多 | 学生-课程 | 建中间表 |
五、面试高频问题
问:为什么多对多要拆中间表?
关系型数据库无法直接表示多对多关系,需要通过第三张表拆解成两个一对多关系。
问:最常见的是哪种关系?
一对多最常见,例如部门与员工、分类与商品、用户与订单。
六:最终总结
表关系本质就是:通过主键和外键,让多张表协同存储数据,避免冗余,提高维护性。