mysql表与表之间建关系
Posted krisyzy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql表与表之间建关系相关的知识,希望对你有一定的参考价值。
一对多
定义一张部门员工表
id | name | gender | dep_name | dep_desc |
1 | yzy | male | 教学部 | 教书育人 |
2 | yolo | male | 外交部 | 形象大使 |
3 | zmm | female | 教学部 | 教书育人 |
4 | czh | male | 教学部 | 教书育人 |
5 | lc | male | 技术部 | 技术能力有限部门 |
把所有数据都存放于一张表的弊端
1.组织结构不清晰
2.浪费硬盘空间
3.扩展性极差
上述的弊端产生原因类似于把代码全部写在一个py文件中,应该怎么做? >> 解耦合!
将上述两张表拆成员工的部门两张表
分析表数据之间的关系:多个员工对应一个部门,一个部门对应多个员工.禁止一个员工对应多个部门
如何查找表与表之间的关系
确立表与表之间的关系 一定要换位思考(必须两方都考虑周全之后才能得出结论)
以员工表和部门表为例
先站在员工表看能否有多个员工对应一个部门
翻译过来:一个部门对应多个员工(可以!!!)
(暂时只能确定员工单向多对一部门)
再站在部门表看能否有多个部门对应一个员工
翻译过来:一个员工能否属于多个部门(不可以!!!)
结论:员工表和部门表之间仅仅是单向的多对一.那么它们的关系就是"一对多"
表关系中没有多对一一说,只有一对多
如何让两张表有代码层面上真正的关联 就必须使用外键
foreign key
外键约束
1.在创建表的时候 必须先创建被关联表
2.在插入数据的时候 必须先插入被关联表的数据
建表 create table dep(id int primary key auto_increment, dep_name varchar(16), dep_desc varchar(32) ); create table staff(id int primary key auto_increment, stf_name varchar(16), stf_gender enum(‘male‘,‘female‘,‘others‘) default ‘male‘, dep_id int, foreign key(dep_id) references dep(id) );
插入数据 insert into dep(dep_name,dep_desc) values(‘社会部‘,‘社会保障‘), (‘警察局‘,‘管理罪犯‘), (‘银行部‘,‘管钱‘); insert into staff(stf_name,dep_id) values(‘yyy‘,1), (‘qqq‘,2), (‘www‘,2), (‘rrr‘,3);
修改表数据 update dep set id=200 where id=1; update staff set dep_id=200 where id=1; delete from dep where id=3; 外键虽然能够强制建立表关系 但是也会给表之间增加数据相关的约束 1.删除数据的时候 需要先删员工表的数据 在删部门表的数据 delete from staff where id=2; delete from dep where id=2;
2.级联更新级联删除 create table dep(id int primary key auto_increment, dep_name varchar(16), dep_desc varchar(32) ); create table staff(id int primary key auto_increment, stf_name varchar(16), stf_gender enum(‘male‘,‘female‘,‘others‘) default ‘male‘, dep_id int, foreign key(dep_id) references dep(id) on update cascade # 同步更新 on delete cascade # 同步删除 ); insert into dep(dep_name,dep_desc) values(‘社会部‘,‘社会保障‘), (‘警察局‘,‘管理罪犯‘), (‘银行部‘,‘管钱‘); insert into staff(stf_name,dep_id) values(‘yyy‘,1), (‘qqq‘,2), (‘www‘,2), (‘rrr‘,3);
多对多
图书表与作者表
先站在图书表
多本书能否有多个作者 <==> 一个作者能否写多本书 可以!!!
再站在作者表
多个作者能否写一本书 <==>一本书能否有多个作者 可以!!!
如果双方都可以,那儿就是多对多
强调: foreign key只是用来帮你建表关系的 不是某个关系特有的方法
多对多关系的建立 必须手动创建第三张表 用来专门记录两张表之间的关系
先建两张普通的表 不需要设置外键 create table book(id int primary key auto_increment, book_name varchar(16), book_desc varchar(128), price int ); create table author(id int primary key auto_increment, name varchar(16), age int );
第三张表
create table book2author(id int primary key auto_increment,
book_id int,
foreign key(book_id) references book(id)
on update cascade
on delete cascade,
author_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade
);
插入数据 insert into book(book_name,book_desc,price) values(‘哪吒‘,‘风火轮‘,100),(‘孙悟空‘,‘金箍棒‘,200),(‘猪八戒‘,‘九齿钉耙‘,10); insert into author(name,age) values(‘yzy‘,19),(‘yolo‘,19); insert into book2author(book_id,author_id) values(4,3); # 报错 insert into book2author(book_id,author_id) values(1,1),(1,2),(2,1),(3,1),(3,2);
一对一表关系
建表 create table peopledetail(id int primary key auto_increment, phone int, addr varchar(128) ); create table people(id int primary key auto_increment, name varchar(16), age int, peopledetail_id int unique, foreign key(peopledetail_id) references peopledetail(id) on update cascade on delete cascade ); insert into peopledetail(phone,addr) values(110,‘火星‘),(120,‘水星‘),(190,‘地球‘); insert into people(name,age,peopledetail_id) values(‘yzy‘,19,1),(‘yolo‘,19,2),(‘zmm‘,19,3);
通常将关系字段 称之为 外键字段
一对多的外键字段 建在多的一方
多对多 建在第三张表里
一对一 外键字段建在任意一方都可以 (推荐建在查询频率较高的一方)
![技术图片](/img/jia.gif)
图书与出版社
一本书可不可以有多个出版社 不可以!!!
一个出版社可不可以出版多本书 可以!!!
一对多的关系
图书与作者表
一本书可不可以有多个作者 可以!!!
一个作者可不可以写多本书 可以!!!
多对多的关系
作者与作者详情
一个作者可不可以有多个详情 不可以!!!
一个作者详情可不可以有多个作者 不可以!!!
要么两者是一对一
要么两者之间没任何关系
修改表的完整语句
1.修改表的完整语句 1. 修改表名 ALTER TABLE 表名 RENAME 新表名; 2. 增加字段 ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…], ADD 字段名 数据类型 [完整性约束条件…]; ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST; # 直接移到最前面 ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; # 寻找插哪个字段的后面 3. 删除字段 ALTER TABLE 表名 DROP 字段名; 4. 修改字段 # modify只能改字段数据类型完整约束,不能改字段名,但是change可以! ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…]; ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
# 查询语句执行的结果也是一张表,可以看成虚拟表 # 复制表结构+记录 (key不会复制: 主键、外键和索引) create table new_service select * from service; # 只复制表结构 select * from service where 1=2; //条件为假,查不到任何记录 create table new1_service select * from service where 1=2; create table t4 like employees;
以上是关于mysql表与表之间建关系的主要内容,如果未能解决你的问题,请参考以下文章