正在加载内容…
MySQL 多表关系与外键
714 字
4 分钟
MySQL 多表关系与外键
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 CASCADECASCADE:级联,主表删除/更新时,从表相关行同步删除/更新。SET NULL:主表删除时,从表外键置为 NULL。RESTRICT/NO ACTION:默认,禁止删除被引用的主表数据。
7.5 常见问题 Q&A
Q1:必须使用外键约束吗? A:不是必须。外键能保证数据一致性,但会带来一定性能开销和迁移成本;很多高并发系统在应用层维护关系而不建物理外键,只保留逻辑关联字段。
Q2:多对多关系怎么建表?
A:需要一张中间表,含两个外键分别指向两张主表,通常还加联合主键。例如 student_course(student_id, course_id)。
Q3:外键字段可以重名吗?
A:可以,外键本身是一个普通字段,命名没有强制要求,但为了可读性通常用”引用表名_字段名”的形式,如 class_id。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章 智能推荐
1
MySQL 数据库与表基础
MySQL 本文介绍MySQL建库建表基础,涵盖数据库分类、常用数据类型及主键、非空、唯一等约束,并用问答说明选型与开发要点。
2
MySQL 联表查询 JOIN
MySQL 本文讲解MySQL联表查询,说明内连接、左右连接及自连接与子查询的用法,并辨析ON与WHERE的区别。
3
MySQL 分组查询与子查询
MySQL 讲解MySQL分组查询与子查询:用GROUP BY配合聚合、HAVING及WITH ROLLUP做分组汇总;子查询按结果分为四类,可用于WHERE、FROM、SELECT及EXISTS相关判断。
4
MySQL SELECT 基础查询与 WHERE
MySQL 本文讲解SELECT基础查询与WHERE过滤,涵盖字段选择、别名、DISTINCT去重、比较与逻辑运算、范围、集合、模糊和空值判断,并说明WHERE不能直接使用SELECT别名。
5
MySQL 排序分页与聚合查询
MySQL 本文讲解MySQL排序、分页、聚合、分组及分组后过滤,说明各子句执行顺序,并辨析WHERE与HAVING、两种COUNT用法的差异。
随机文章 随机推荐
评论区
正在加载 GitHub 评论…