如何分辨三种关系,以及三种关系的图列对比。
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)