· MySQL 多表关系与外键

MySQL 多表关系与外键

714 字
4 分钟
MySQL 多表关系与外键
StarryLin/Geek · 摘要

MySQL数据库通过拆表减少冗余,利用一对多、多对多、一对一三种表关系,并通过外键约束及级联、置空等联动行为保证引用完整性。

第7章 多表关系与外键#

7.1 为什么要拆成多张表#

在实际业务中,数据往往不是孤立的一张表。比如学校里有班级、学生、课程,学生要选课。如果把所有信息塞进一张大表,会造成大量冗余:同一个班级的班名、班主任在每个学生行里重复出现,修改时容易漏改、不一致。因此需要把数据拆成多张表,通过”关系”把它们连起来,这就是关系型数据库的核心思想。

7.2 三种表关系#

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

erDiagram %% SchoolClass 对应班级表 CLASS SchoolClass ||--o{ STUDENT : "一对多" STUDENT }o--o{ COURSE : "多对多" STUDENT ||--o| STUDENT_DETAIL : "一对一"
  • 一对多:一个班级有多个学生,一个学生只属于一个班级。实现方式是在”多”的一方(student)加外键指向”一”的一方(class)。
  • 多对多:一个学生选多门课,一门课被多个学生选。需要通过一张中间表(如 student_course)拆成两个一对多。
  • 一对一:一个学生对应一份详情档案。通常在主表加唯一外键实现。

7.3 外键 FOREIGN KEY#

外键是”多”的一方用来引用”一”的一方主键的字段,用于保证数据的引用完整性:

CREATE TABLE class (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL
);
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
class_id INT,
CONSTRAINT fk_student_class
FOREIGN KEY (class_id) REFERENCES class(id)
);

fk_student_class 是外键名,class_id 引用 class 表的 id。加了外键后,插入一个 class_id 不存在的学生会失败,删除还有学生引用的班级也会受限制,从而避免产生”孤儿数据”。

7.4 外键的约束行为#

删除或更新被引用数据时,外键可以通过 ON DELETE、ON UPDATE 指定联动行为:

FOREIGN KEY (class_id) REFERENCES class(id)
ON DELETE SET NULL
ON UPDATE CASCADE
  • CASCADE:级联,主表删除/更新时,从表相关行同步删除/更新。
  • SET NULL:主表删除时,从表外键置为 NULL。
  • RESTRICT / NO ACTION:默认,禁止删除被引用的主表数据。

7.5 常见问题 Q&A#

Q1:必须使用外键约束吗? A:不是必须。外键能保证数据一致性,但会带来一定性能开销和迁移成本;很多高并发系统在应用层维护关系而不建物理外键,只保留逻辑关联字段。

Q2:多对多关系怎么建表? A:需要一张中间表,含两个外键分别指向两张主表,通常还加联合主键。例如 student_course(student_id, course_id)。

Q3:外键字段可以重名吗? A:可以,外键本身是一个普通字段,命名没有强制要求,但为了可读性通常用”引用表名_字段名”的形式,如 class_id。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

MySQL 多表关系与外键
https://mjzy.tech/posts/mysql/07-多表关系与外键/
作者
JIA
发布于
2026-08-21
许可协议
CC BY-NC-SA 4.0

评论区

正在加载 GitHub 评论…

Tips · 随手记
仅自己可见 · 每篇文章单独保存

文章目录