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

1.分析三种关系。

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

2.三种关系:

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

3.图解三种关系:

  1. 一对一关系:学生与学号关系(关联方式:foreign key)
                   
stu表         school_num表        
id stuname       stu_num school user_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 cascadeon 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   Id name school_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 cascadeon 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        
id name       id name      
1 老王       1 翻墙      
2 老陈       2 爬楼      
3 老李       3 开锁      
4 老张       4 气功      
                   
  stu_course                
  id student_id course_id            
  1 1 1            
  2 1 2            
  3 2 3            
  4 3 4            
  5 4 3            
 创建被关联表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 cascadeon update cascade,constraint fk_course foreign key(course_id) references course(id)on delete cascadeon 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)

MySql数据库三种关系详解相关推荐

  1. mysql binlog_format 三种格式 详解 ---摘抄

    MySQL 5.5 中对于二进制日志 (binlog) 有 3 种不同的格式可选:Mixed,Statement,Row,默认格式是 Statement.总结一下这三种格式日志的优缺点. MySQL ...

  2. mysql 删除数据表中数据_Mysql-删除数据表-三种方式详解

    Mysql 删除数据表的三种方式详解 用法: 1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, ...

  3. eclipse java 逆向工程_Mybatis 逆向工程的三种方法详解

    Mybatis 逆向工程 逆向工程通常包括由数据库的表生成 Java 代码 和 通过 Java 代码生成数据库表.而Mybatis 逆向工程是指由数据库表生成 Java 代码. Mybaits 需要程 ...

  4. MySQL数据库update语句使用详解

    MySQL数据库update语句使用详解 本篇文章我们来讲讲如何对MySQL数据库进行更新操作,对数据库进行增删改查操作是我们必会的基础之一,会了这个增删改查我们可以在这基础上去编写更多的东西,废话不 ...

  5. java连接MySQL几种方法_Java连接MySQL数据库三种方法

    好久没有更新博客了!今天利用周目时学习了一下数据库mysql.介绍一下数据库的三种连接方式! 开发工具:Myeclipse MySQL5.6 MySQL连接驱动:mysql-connector-jav ...

  6. python 命令-python解析命令行参数的三种方法详解

    这篇文章主要介绍了python解析命令行参数的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python解析命令行参数主要有三种方法: ...

  7. Maven精选系列--三种仓库详解

    转载自 Maven精选系列--三种仓库详解 仓库分类 1.本地仓库 本地仓库就是开发者本地已经下载下来的或者自己打包所有jar包的依赖仓库,本地仓库路径配置在maven对应的conf/settings ...

  8. 全站仪与计算机之间的数据传输,必看!全站仪数据传输的三种方式详解,都安排得明明白白(上)...

    原标题:必看!全站仪数据传输的三种方式详解,都安排得明明白白(上) 科力达全站仪数据传输 一般而言,全站仪的数据传输方式有三种,分别是通过串口.USB.SD卡三种方式,因为电脑配置等因素的不同,一些数 ...

  9. 查看登陆系统用户的信息的三种方法详解

    查看登陆系统用户的信息的三种方法详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.who这个命令显示可以谁在登陆,但是这个有很多的花式玩法,这个命令超简单 语法:who [O ...

最新文章

  1. 用gensim学习word2vec
  2. 图的遍历:BFS和DFS
  3. 大型监控网络系统如何规划ip地址?
  4. 怎么判断手机在抖动_集合来了!激光头切割过程中一直抖动、跳动、上下动是什么原因?...
  5. Ubuntu 16.04 下部署Node.js+MySQL微信小程序商城
  6. FAT和EXFAT文件系统
  7. 由friend用法引出的声明与定义那些事儿
  8. 出现Field 'ssl_cipher' doesn't have a default value错误怎么解决
  9. jQuery 方法 十四. html()方法和text()方法
  10. Oracle CRS/ASM/RAC版本兼容对应表
  11. Android 使用 TableLayout 布局拉伸宽度
  12. 微信支付java后台
  13. jquery ajax 方法及各参数详解
  14. Unity跨iOS、Android平台使用protobuf-net的方法(.Net 2.0)《二》
  15. 关于华为手机使用MTK刷机时出现failed to get PMT info的解决办法
  16. 罗马java_罗马数字转换工具-java
  17. Lambda-Stream应用
  18. 扇贝单词里有计算机英语吗,扇贝单词记录
  19. bzoj1754 [Usaco2005 qua]Bull Math
  20. 前端基础----html初识、常用标签

热门文章

  1. #defned typedef 以及#ifdef #define #ifndef #endif
  2. RT-thread基础移植//依据rtt实战学习记录
  3. 数学建模 --- 层次分析法(AHP模型)
  4. 购买抖币显示苹果服务器异常,抖音刷礼物为什么显示当前设备不支持苹果应用内支付?...
  5. 1、已知:1公里=2里=1000米,请编写一个程序,输入公里数,将其转换成里和米。要求程序的输入输出如下: 请输入公里数: 3.3 3.30公里=6.60里=3300米
  6. LXC/LXD缓存镜像至本地
  7. Codeforces ~ 990A ~ Commentary Boxes (水)
  8. R语言 lavaan包进行结构方程模型SEM
  9. 以 回车键 为结束标志的输入
  10. C语言零基础速通——函数(7分钟搞懂)