MySql数据库三种关系详解

mac2025-06-21  11

如何分辨三种关系,以及三种关系的图列对比。

1.分析三种关系。

是否左表的多条记录可以对应右表的一条记录,是,则证明左表的一个字段 关联(foreign key)右表的一个字段(通常为ID)是否右表的多条记录可以对应左表的一套记录,是,则证明右表的一个字段关联(foreign key)右表的一个字段(通常为ID)

2.三种关系:

一对一:第一步都不成立,而是左表和右表都只是互相对应彼此唯一一条记录(通常互为主键)。直接使用外键关联即可。一对一外键一般在从表中。一对多:第一步中任意一条成立即可。一对多关联,外键一般都在多表的一方。多对多:第一步中两条全成立。需要建立一张中间表(作用为存放彼此的外键)。外键一般都是在中间表中。

3.图解三种关系:

一对一关系:学生与学号关系(关联方式:foreign key)           stu表    school_num表    idstuname   stu_numschooluser_id  1张三   10001哈佛大学1  2李四   10002哈佛大学2  3王五   10003哈佛大学3  4赵六   10004哈佛大学4             # 创建学生表 create table stu( id int primary key auto_increment, stuname varchar(20) ); # 创建学号表 create table school_num( stu_num int primary key not null, school varchar(100), user_id int unique, constraint fk_stu foreign key(user_id) references stu(id) on delete cascade on update cascade ); #插入学生表中的记录 insert into stu(stuname) values ('张三'), ('李四'), ('王五'), ('赵六') ; # 插入学号表表的记录 insert into school_num(stu_num,school,user_id) values (10001,'哈佛大学',1), (10002,'哈佛大学',2), (10003,'哈佛大学',3), (10004,'哈佛大学',4); # 查询赵六的学号地址 select stu_num from school_num where user_id=4;

2.一对多:学生与学校关系

                school表  student表    id school Idnameschool_id  1清华大学 1来福1  2复旦大学 2旺财1  3哈佛大学 3如花2  4家里蹲大学 4酱爆3     5石榴姐4     6方唐镜4   create table school( id int primary key auto_increment, school varchar(20) ); create table student( id int primary key auto_increment, name varchar(20), school_id int not null, constraint fk_sch_stu foreign key(school_id) references school(id) on delete cascade on update cascade ); # 先往被关联表中插入记录 insert into school(school) values ('清华大学'), ('复旦大学'), ('哈佛大学'), ('家里蹲大学') ; # 再往关联表中插入记录 insert into student(name,school_id) values ('来福',1), ('旺财',1), ('如花',2), ('酱爆',3), ('石榴姐',4), ('方唐镜',4) ; 查询结果: mysql> select * from school; +----+-----------------+ | id | school | +----+-----------------+ | 1 | 清华大学 | | 2 | 复旦大学 | | 3 | 哈佛大学 | | 4 | 家里蹲大学 | +----+-----------------+ 4 rows in set (0.00 sec) mysql> select * from student; +----+-----------+-----------+ | id | name | school_id | +----+-----------+-----------+ | 1 | 来福 | 1 | | 2 | 旺财 | 1 | | 3 | 如花 | 2 | | 4 | 酱爆 | 3 | | 5 | 石榴姐 | 4 | | 6 | 方唐镜 | 4 | +----+-----------+-----------+ 6 rows in set (0.00 sec) #查询所有学校学生信息 mysql> select * from school,student where school.id=student.school_id; +----+-----------------+----+-----------+-----------+ | id | school | id | name | school_id | +----+-----------------+----+-----------+-----------+ | 1 | 清华大学 | 1 | 来福 | 1 | | 1 | 清华大学 | 2 | 旺财 | 1 | | 2 | 复旦大学 | 3 | 如花 | 2 | | 3 | 哈佛大学 | 4 | 酱爆 | 3 | | 4 | 家里蹲大学 | 5 | 石榴姐 | 4 | | 4 | 家里蹲大学 | 6 | 方唐镜 | 4 | +----+-----------------+----+-----------+-----------+ 6 rows in set (0.00 sec)

3.多对多关系:学生与课程关系

          student    course    idname   idname   1老王   1翻墙   2老陈   2爬楼   3老李   3开锁   4老张   4气功              stu_course         idstudent_idcourse_id       111       212       323       434       543       创建被关联表student表 create table student( id int primary key auto_increment, name varchar(20) ); 创建被关联course表 create table course( id int primary key auto_increment, name varchar(20) ); #这张表就存放了student表和course表的关系,即查询二者的关系查这表就可以了 create table stu_course( id int not null unique auto_increment, student_id int not null, course_id int not null, constraint fk_student foreign key(student_id) references student(id) on delete cascade on update cascade, constraint fk_course foreign key(course_id) references course(id) on delete cascade on update cascade, primary key(student_id, course_id) ); #插入四个学生,id依次排开 insert into student(name) values('老王'),('老陈'),('老李'),('老张'); #插入课程,id依次排开 insert into course(name) values('翻墙'),('爬楼'),('开锁'),('气功'); # 每个学生的报名的课程 老王: 翻墙、爬楼 老陈: 开锁 老李:气功 老张:开锁 # 在author2book表中插入相应的数据 insert into stu_course(student_id,course_id) values (1,1), (1,2), (2,3), (3,4), (4,3) ; # 现在就可以查stu_course对应的作者和书的关系了 mysql> select * from stu_course; +----+------------+-----------+ | id | student_id | course_id | +----+------------+-----------+ | 1 | 1 | 1 | | 2 | 1 | 2 | | 3 | 2 | 3 | | 4 | 3 | 4 | | 5 | 4 | 3 | +----+------------+-----------+ 5 rows in set (0.00 sec) #查询所有学生包的所有课程 mysql> select student.name '学生课程',course.name '课程名称' from student,course,stu_course where student.id=stu_course.student_id and course.id=stu_course.course_id; +--------------+--------------+ | 学生课程 | 课程名称 | +--------------+--------------+ | 老王 | 翻墙 | | 老王 | 爬楼 | | 老陈 | 开锁 | | 老张 | 开锁 | | 老李 | 气功 | +--------------+--------------+ 5 rows in set (0.01 sec)

 

 

最新回复(0)