前言
本文来讲解数据库表的三种关系,旨在帮助读者更好的预习,理解以及复习😊个人主页:艺杯羹
系列专栏:MySQL
一. 什么是数据库表的关系
数据库表的关系分为三种
关系类型 |
描述 |
约束 |
一对多 |
一表一条数据对应另一表多条 |
外键在多方,可重复、有空值 |
一对一 |
两表数据一 一对应 |
外键设唯一约束,先删外键后删主键 |
多对多 |
两表对象互成一对多 |
中间表两列联合主键,分别外键参照主表 |
二. 一对多关系
一种对象与另一种对象是 一 一 对应关系
一对多关系是建立在两张表之间的关系。一个表中的一条数据可以对应另一个表中的多条数据。
可以添加外键约束保证数据的参照完整性,外键一直都是在多方。
注:外键允许重复,允许含有空值
例如学生表和班级表可以是一个一对多的关系
可以这么理解:一个班级对应着多个学生,就是一对多的关系
实例:
- 创建一个班级表
create table calss_table( -- 班级id,并设置为主键和自动增长 class_id int primary key auto_increment, -- 班级名称 calss_name varchar(50) );
- 创建一个学生表
create table student_table( student_id int primary key auto_increment, student_name varchar(50), student_class_id, -- 对student_class_id设置外键 -- 链接到 class_table 表中的 calss_id 的主键 foreign key(student_class_id) references class_table(class_id) );
班级表通过外键来和学生表来建立连接
三. 一对一关系
简单来说就是:一种对象与另一种对象是一一对应关系
一对一关系是建立在一对多的基础之上,一个表中的一条数据只能对应另一个表中的一条数据。
那么这不就和唯一约束很类似了吗,所以可以用唯一约束,就更好的维护了参照完整性
tips:如果添加的外键约束,那么删除数据时,一定是先删除有外键一方的数据
还是拿刚刚的学生表和班级表来举例
可以这么理解:
一个学生只能对应一个教室,而一个教室只能对应一个唯一的学生
- 创建班级表
create table class_table ( -- 班级id,作为主键并自动递增 class_id int primary key auto_increment, -- 班级名称 class_name varchar(50) );
- 创建学生表
create table student_table( student_id int primary key auto_increment, student_name varchar(50), -- 添加unique约束实现一对一 student_class_id int unique, -- 对student_class_id设置外键 -- 链接到 class_table 表中的 calss_id 的主键 foreign key(student_class_id) references class_table(class_id) );
看到和一对多的区别没,就是在于是否有unique的唯一约束
这里的意思就是,每个学生只能对应一个班级
四. 多对多关系
也就是两个对象彼此都是一对多的关系
这里和前两个关系不同的是,这里需要借助中间表来实现
中间表里建立两个列,然后需要用这两个列作为这个表的联合主键,然后每个列在作为外键参照各自的表的主键
拿学生和课程之间来举例就是:一个学生可以选修多门课程,一个课程能被选择多个学生
实例:
- 创建学生表,课程表,以及中间表
-- 创建学生表 create table students ( -- 学生id,作为主键,自动递增 student_id int primary key auto_increment, -- 学生姓名 student_name varchar(10) ); -- 创建课程表 create table courses ( -- 课程id,作为主键,自动递增 course_id int primary key auto_increment, -- 课程名称 course_name varchar(20) ); -- 创建中间表 create table student_courses ( -- 是外键,关联学生表的student_id student_id int, -- 是外键,关联课程表的course_id course_id int, -- 联合主键 primary key (student_id, course_id), foreign key (student_id) references students(student_id), foreign key (course_id) references courses(course_id) );
- 插入数据并使用中间表来关联
-- 插入学生数据 insert into students (student_name) values ('艺杯羹'), ('小王'); -- 插入课程数据 insert into courses (course_name) values ('C语言'), ('java'); -- 在中间表插入关系数据,表示艺杯羹选了C语言和java,小王选了C语言 insert into student_courses (student_id, course_id) values (1, 1), (1, 2), (2, 1);
Tips:
插入数据:先插入两张主表的数据,再插入中间表的数据
删除数据:先删除中间表(即有外键的表),再删除两个主表
这就好像是先添加主键,再添加外键
删除:先删除外键数据再删除主键数据
关系图:
五. 总结
希望本文能够帮助到你(* ̄︶ ̄)