前言

不合理的表结构(案例)

先来看下面这张表

emp_info 员工信息表

id name gender dep_name dep_desc
1 jason male 教学部 教书育人
2 egon male 外交部 漂泊流浪
3 tank male 教学部 教书育人
4 kevin male 技术部 技术开发

所有的信息都记录在一张表中了

带来的问题

  • 表的结构不清晰
  • 浪费硬盘空间,数据冗余较多
  • 表的扩展性、可维护性极差(无法忽视的缺点)

如何解决问题?

拆表,确定表关系,建立表关联

确定表与表之间的关系,一定要换位思考(必须两方都考虑周全之后才能得出结论)

以员工表和部门表为例:
先站在员工表看能否有多个员工对应一个部门
翻译过来:
一个部门能付否有多个员工
可以!!!(暂时只能确定员工单向多对一部门)
再站在部门表看能否有多个员工一起对应一个部门
翻译过来
....乱了

如何确定表关系?

查找表关系,一定要分别站在两张表的角度全部考虑完毕才能下结论,否则无法得出正确答案

表关系

  • 一对多
  • 多对多
  • 一对一

或者两张表没有关系

一对多

单向的多对一就是“一对多”的外键关系

无论是一对多还是多对一都是一对多的关系,都叫一对多,没有多对一的关系

多对多

如果两边都是单向的多对一关系,那么两者就是多对多的关系

分析

多对多的关系,必须额外创建第三张表,用来专门记录两种表之间的关联关系

  • 如果按一对一的思路来,两张表都必须关联对方,都必须让对方先建立,那就建不了表了,外键存的是关联关系,那就单独开一张表,存关联关系

案例建立

同步更新删除是在外键上的

一对一

应用场景

  • 表特别庞大时拆表优化性能(用户详细信息与展示信息)
  • 客户与学生(客户可能成为学生,学生一定是客户)

如果双向的一对多都不成立,那么两张表之间只有两种情况了

  1. 一对一的关系
  2. 根本没有关系

外键字段必须用foreign key + unique 来限制,唯一且必须出现

判断表关系最简单的语法

三种关系常见案例

一对多

有一个可以就是一对多的关系(有且只有一个

图书与出版社

一本书可不可以有多个出版社?不可以

一个出版社可不可以初版多本书,可以!!!

一对多的关系

多对多

有两个可以就是多对多的关系

图书与作者表

一本书可不可以有多个作者 可以!!

一个作者可不可以写多本书 可以!!

多对多的关系

一对一 或 没有关系

两个都不可以,要么是一对一的关系,要么没有关系

作者与作者详情

一个作者可不可以有多个详情 不可以!!

一个作者详情可不可以有多个作者 不可以!!!

一对一的关系

如何建立表关系?

外键 foreign key

在MySQL中通过外键来建立表与表之间的硬性关系

通常将关系字段称之为外键字段

确定外键字段归属方

  • 一对多的外键字段,应该建在“多”的那一方
  • 多对多的外键字段建在额外的第三张表
  • 一对一的外键字段建在任意一方都行,但推荐建在查询频率较高的一方(外键字段必须保证唯一性)

有外键关系的注意点

  • 创建表的时候,必须先创建被关联表
  • 插入数据的时候也应该先插入被关联数据
  • 级联更新,级联删除

注意外键的逗号,(逗号代表一个字段的结束)(还是不要忘了建表的字段定义那块最后一个语句不要加 , 逗号)

外键虽然能够帮你强制建立表关系,但也会给两行表之间增加数据相关的约束

修改表

mysql 对大小写不敏感

一定要注意是英文符号

修改表名

ALTER TABLE 表名 RENAME 新表名;
alter table 表名 rename 新表名;

增加字段

ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…], ADD 字段名  数据类型 [完整性约束条件…];
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST; # 直接移到最前面
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; # 选择要插在哪个字段后面

删除字段

ALTER TABLE 表名 DROP 字段名;

修改字段

# modify只能改字段数据类型完整约束,不能改字段名,但是change可以!
ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];

复制表

复制表结构+记录

key不会复制:主键、外键和索引

# 查询语句执行的结果也是一张表,可以看成虚拟表

# 复制表结构+记录 (key不会复制: 主键、外键和索引)
create table new_service select * from service; like 可以吗? 试试

利用条件实现仅复制表结构

条件为假,查不出数据

select * from service where 1=2;        //条件为假,查不到任何记录

# 只复制表结构
create table new1_service select * from service where 1=2;
create table t4 like employees;

今日数据库操作语句

创建数据库

mysql> create database db1;
Query OK, 1 row affected (0.01 sec) mysql>
mysql>
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| just_test |
| mysql |
| performance_schema |
| test |
+--------------------+
6 rows in set (0.00 sec)

拆分员工与部门信息成两张表

一个员工属于一个部门

一个部门有多个员工

---> 一对多

在员工那边保留部门编号

创建表(员工与部门信息表)

create table dep(
id int primary key auto_increment,
dep_name varchar(30),
dep_comment varchar(60)
); create table emp(
id int primary key auto_increment,
name varchar(50),
gender enum('male', 'famale', 'others') not null default 'male',
dep_id int,
foreign key(dep_id) references dep(id)
); insert into dep (dep_name, dep_comment) values('研发部', '敲代码的那一群人'), ('教育部', '成天这啊那啊找麻烦的那群人'), ('后勤保障部', '搬水的关门的收拾卫生的'); insert into emp (name, dep_id) values('jason', 1), ('egon', 2), ('agong', '3'); alter table emp modify foreign key(dep_id) refrences dep(id)
on update cacade
on delete cacade;

select emp.id,name,gender,dep.dep_name,dep.dep_comment from emp left join dep on dep.id=emp.id;

MySQ-表关系-外键-修改表结构-复制表-03的更多相关文章

  1. Django框架表关系外键-多对多外键(增删改查)-正反向的概率-多表查询(子查询与联表查询)

    目录 一:表关系外键 1.提前创建表关系 2.目前只剩 书籍表和 书籍作者表没创建信息. 3.增 4.删 5.修改 二:多对多外键增删改查 1.给书籍绑定作者 2.删 3.修改 4.清空 三:正反向的 ...

  2. MySQL表关系--外键

    一.外键前戏 如果我们把所有的信息都记录在一张表中会带来的问题: 1.表的结构不清晰 2.浪费磁盘空间 3.表的扩展性极差 所以我们要把这种表拆成几张不同的表,分析表与表之间的关系. 确定表与表之间的 ...

  3. EF实体框架-从数据库更新模型 一部分表的外键(导航属性)无法显示

    从数据库更新模型 要想让数据库表之间的外键关系 显示到实体模型的导航属性中去. 表的外键 对应另一张表的字段要是主键,唯一键显示不出来

  4. mysql如何添加一个表的外键

    1:创建一个父表,主键作为子表的外键: create table province( pId int primary key auto_increment, pName varchar() ); 2: ...

  5. Oracle查找表的外键引用关系

    Oracle查找表的外键引用关系 select t1.table_name, t2.table_name as "TABLE_NAME(R)", t1.constraint_nam ...

  6. SQL学习:主键,外键,主键表,外键表,数据库的表与表之间的关系;

    在数据库的学习中,对于一个表的主键和外键的认识是非常重要的. 主键:在一个表中,能唯一的表示一个事物(或者一条记录)的字段,我们称之为主键 注意: 主键的设置可以不只是用一个字段,也可以用若干个字段的 ...

  7. Python-多表关联 外键 级联

    分表为什么分表 多表关联多表关系 ****** 表之间的关系 为什么要分表 多对一 一个外键 多对多 一个中间表 两个外键 一对一 一个外键加一个唯一约束外键约束 ****** foreign key ...

  8. MYSQL - 外键、约束、多表查询、子查询、视图、事务

    MYSQL - 外键.约束.多表查询.子查询.视图.事务 关系 创建成绩表scores,结构如下 id 学生 科目 成绩 思考:学生列应该存什么信息呢? 答:学生列的数据不是在这里新建的,而应该从学生 ...

  9. MySQL删除所有表的外键约束、禁用外键约束

    转: MySQL删除所有表的外键约束.禁用外键约束 2017年10月27日 00:11:34 李阿飞 阅读数:4512   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...

随机推荐

  1. LG2467 地精部落

    题意 给出\(n\),求有几个\(W\)形的\(n\)的全排列(震荡) 思路 可以变求出第二个数比第一个数大的,再翻倍就好 设\(f[i][j]\)表示\(i\)个数中\(j\)个数不符合序列 转移时 ...

  2. PAT L2-001 紧急救援 —— (多参数最短路)

    和天梯中的直捣黄龙差不多.但是,通过这个问题,我对多参数最短路又有了更深一层的了解. 这题因为点数比较多,所以如果直接用大力学长的在G上dfs找最短路径的条数的话,会TLE,所以需要剪枝.剪枝方法是, ...

  3. js 给元素绑定回车事件

    经常会看到登录页面输入完账户密码,回车就登录了.实现方法: JQuery方法: $("#focus")为获取id为focus的元素 $("#focus").ke ...

  4. 用Python写一个将Python2代码转换成Python3代码的批处理工具

    之前写过一篇如何在windows操作系统上给.py文件添加一个快速处理的右键功能的文章:<一键将Python2代码自动转化为Python3>,作用就是为了将Python2的文件升级转换成P ...

  5. Django中三种方式写form表单

    除了在html中自己手写form表单外,django还可以通过 继承django.forms.Form 或django.forms.ModelForm两个类来自动生成form表单,下面依次利用三种方式 ...

  6. Python —— sklearn.feature_selection模块

    Python —— sklearn.feature_selection模块 sklearn.feature_selection模块的作用是feature selection,而不是feature ex ...

  7. 1.springboot内置tomcat的connection相关

    最近在研究tomcat的连接超时问题,环境:jdk1.8 + springboot 2.1.1.RELEASE,以下仅为个人理解,如果异议,欢迎指正. springboot的tomcat的几个配置参数 ...

  8. <JavaScript>如何阅读《JavaScript高级程序设计》(一)

    题外话 最近在看<JavaScript高级程序设计>这本书,面对着700多页的厚书籍,心里有点压力,所以我决定梳理一下..探究一下到底怎么读这本书.本书的内容好像只有到ES5...所以只能 ...

  9. css sprite 雪碧图

    使用雪碧图的目的:有时为了美观,我们会使用一张图片来代替一些小图标,但是一个网页可能有很多很多的小图标,浏览器在显示页面的时候,就需要像服务器发送很多次访问请求, 这样一来,一是造成资源浪费,二是会导 ...

  10. haproxy-负载均衡介绍

    参考:http://www.iyunv.com/thread-252539-1-1.html 负载均衡介绍 四层和七层负载均衡的区别 四层 所谓的四层就是ISO参考模型中的第四层.四层负载均衡也称为四 ...