在 MySQL 中,外键 (Foreign Key) 用于维护表与表之间的关系,保证数据的一致性和完整性。理解 一对一、一对多 和 多对多 关系,核心在于如何通过外键约束建立不同的表之间的关联。
一对一 (One-to-One)
- 定义:一个表中的一条记录只能对应另一个表中的一条记录,反之亦然。
- 实现方式:在其中一个表的主键作为外键引用另一个表的主键。
示例
用户表和用户详情表,每个用户只能有一条对应的详情记录。
1 | CREATE TABLE users ( |
特点
- user_details.user_id 是 users.id 的外键。
- 确保每个 user_details 记录与一个 users 记录严格一一对应。
一对多 (One-to-Many)
定义:一个表中的一条记录可以关联另一个表中的多条记录,但反过来不成立。
实现方式:在“多”的那一方添加外键,指向“单”的那一方的主键。
示例
一个用户可以有多篇文章,但一篇文章只能属于一个用户。
1 | CREATE TABLE users ( |
特点
- posts.user_id 是 users.id 的外键。
- 确保 posts 中的多条记录可以对应到 users 中的同一条记录。
多对多 (Many-to-Many)
- 定义:一个表中的一条记录可以关联另一个表中的多条记录,同时反过来也成立。
- 实现方式:通过中间表来实现,将两张表的主键作为中间表的外键。
示例
一个学生可以选修多门课程,一门课程可以有多个学生选修。
1 | CREATE TABLE students ( |
特点
- student_courses 是中间表,包含 student_id 和 course_id 两列,分别关联 students 和 courses 表。
- PRIMARY KEY (student_id, course_id) 保证了一个学生不能重复选修同一课程。
总结
一对一:主键对主键,或唯一键。
一对多:主键对外键,外键在“多”的那一方。
多对多:通过中间表管理两表之间的多对多关系。