MySql数据库三种关系详解
如何分辨三种关系,以及三种关系的图列对比。
1.分析三种关系。
- 是否左表的多条记录可以对应右表的一条记录,是,则证明左表的一个字段 关联(foreign key)右表的一个字段(通常为ID)
- 是否右表的多条记录可以对应左表的一套记录,是,则证明右表的一个字段关联(foreign key)右表的一个字段(通常为ID)
2.三种关系:
- 一对一:第一步都不成立,而是左表和右表都只是互相对应彼此唯一一条记录(通常互为主键)。直接使用外键关联即可。一对一外键一般在从表中。
- 一对多:第一步中任意一条成立即可。一对多关联,外键一般都在多表的一方。
- 多对多:第一步中两条全成立。需要建立一张中间表(作用为存放彼此的外键)。外键一般都是在中间表中。
3.图解三种关系:
- 一对一关系:学生与学号关系(关联方式: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数据库三种关系详解相关推荐
- mysql binlog_format 三种格式 详解 ---摘抄
MySQL 5.5 中对于二进制日志 (binlog) 有 3 种不同的格式可选:Mixed,Statement,Row,默认格式是 Statement.总结一下这三种格式日志的优缺点. MySQL ...
- mysql 删除数据表中数据_Mysql-删除数据表-三种方式详解
Mysql 删除数据表的三种方式详解 用法: 1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, ...
- eclipse java 逆向工程_Mybatis 逆向工程的三种方法详解
Mybatis 逆向工程 逆向工程通常包括由数据库的表生成 Java 代码 和 通过 Java 代码生成数据库表.而Mybatis 逆向工程是指由数据库表生成 Java 代码. Mybaits 需要程 ...
- MySQL数据库update语句使用详解
MySQL数据库update语句使用详解 本篇文章我们来讲讲如何对MySQL数据库进行更新操作,对数据库进行增删改查操作是我们必会的基础之一,会了这个增删改查我们可以在这基础上去编写更多的东西,废话不 ...
- java连接MySQL几种方法_Java连接MySQL数据库三种方法
好久没有更新博客了!今天利用周目时学习了一下数据库mysql.介绍一下数据库的三种连接方式! 开发工具:Myeclipse MySQL5.6 MySQL连接驱动:mysql-connector-jav ...
- python 命令-python解析命令行参数的三种方法详解
这篇文章主要介绍了python解析命令行参数的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python解析命令行参数主要有三种方法: ...
- Maven精选系列--三种仓库详解
转载自 Maven精选系列--三种仓库详解 仓库分类 1.本地仓库 本地仓库就是开发者本地已经下载下来的或者自己打包所有jar包的依赖仓库,本地仓库路径配置在maven对应的conf/settings ...
- 全站仪与计算机之间的数据传输,必看!全站仪数据传输的三种方式详解,都安排得明明白白(上)...
原标题:必看!全站仪数据传输的三种方式详解,都安排得明明白白(上) 科力达全站仪数据传输 一般而言,全站仪的数据传输方式有三种,分别是通过串口.USB.SD卡三种方式,因为电脑配置等因素的不同,一些数 ...
- 查看登陆系统用户的信息的三种方法详解
查看登陆系统用户的信息的三种方法详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.who这个命令显示可以谁在登陆,但是这个有很多的花式玩法,这个命令超简单 语法:who [O ...
最新文章
- 用gensim学习word2vec
- 图的遍历:BFS和DFS
- 大型监控网络系统如何规划ip地址?
- 怎么判断手机在抖动_集合来了!激光头切割过程中一直抖动、跳动、上下动是什么原因?...
- Ubuntu 16.04 下部署Node.js+MySQL微信小程序商城
- FAT和EXFAT文件系统
- 由friend用法引出的声明与定义那些事儿
- 出现Field 'ssl_cipher' doesn't have a default value错误怎么解决
- jQuery 方法 十四. html()方法和text()方法
- Oracle CRS/ASM/RAC版本兼容对应表
- Android 使用 TableLayout 布局拉伸宽度
- 微信支付java后台
- jquery ajax 方法及各参数详解
- Unity跨iOS、Android平台使用protobuf-net的方法(.Net 2.0)《二》
- 关于华为手机使用MTK刷机时出现failed to get PMT info的解决办法
- 罗马java_罗马数字转换工具-java
- Lambda-Stream应用
- 扇贝单词里有计算机英语吗,扇贝单词记录
- bzoj1754 [Usaco2005 qua]Bull Math
- 前端基础----html初识、常用标签
热门文章
- #defned typedef 以及#ifdef #define #ifndef #endif
- RT-thread基础移植//依据rtt实战学习记录
- 数学建模 --- 层次分析法(AHP模型)
- 购买抖币显示苹果服务器异常,抖音刷礼物为什么显示当前设备不支持苹果应用内支付?...
- 1、已知:1公里=2里=1000米,请编写一个程序,输入公里数,将其转换成里和米。要求程序的输入输出如下: 请输入公里数: 3.3 3.30公里=6.60里=3300米
- LXC/LXD缓存镜像至本地
- Codeforces ~ 990A ~ Commentary Boxes (水)
- R语言 lavaan包进行结构方程模型SEM
- 以 回车键 为结束标志的输入
- C语言零基础速通——函数(7分钟搞懂)