表之间的关系

# 定义一张部门员工表
emp
id name gander dep_name dep_desc
1 ming male 教学部 教书
2 lilei male 教学部 教书
3 hammm female 销售部 销售工作
4 hong female 技术部 技术能力
'''
把所有数据存放到一张表中的弊端:
1.组织结构不清晰(重点是人还是部门?)
2.浪费银盘空间(重复的内容多)
3.扩展性极差(改动部门名要改动多行数据)
'''
# 上述代码的弊端类似把代码全部写到一个py文件中,所以应该>>>解耦合
# 1.将表中拆成两张表,一张员工表,一张部门表
# 2.分析两张表中的数据之间关系:(一对多,多对多,一对一)
# 1.站在员工表的角度:多个员工属于一个部门
# 2.站在部门表的角度:多个部门不能对应一个员工
# 3.然后将拆分后的两张表建立联系
 

拆分后的两张表:
emp
id name gander dep_id
1 ming male 1
2 lilei male 1
3 hammm female 2
4 hong female 3

dep
id dep_name dep_desc
1 教学部 教书
2 销售部 销售工作
3 技术部 技术能力
 

外键 foreign key

# 上述建立关系后的两张表中,员工表中的dep_id我可以随意改动,所以应该有一种限制,限制dep_id字段必须只能是部门表已有的id字段才合理

'''
foreign key
1.外键是绑定两张表关系的关键字,外键要建在主关联表中
2.先创建被关联表,才能创建主关联表
3.在插入记录时,必须先插被关联的记录,才能插主关联表
4.删除记录时,先删除主关联表中的记录,当主关联表中的记录与被关联表中的记录没有联系时,被关联表中的该条记录才能删除
'''

级联更新级联删除 on update cascade ,on delete cascade

# 受限于外键约束,导致操作数据变得非常复杂,能否有一种简单的方式,让我们不需要考虑在操作目标表的时候还需要考虑关联表的情况,比如直接删除被关联表中的部门,对应在主关联表中的该部门的员工都被删除.
'''
级联更新:on update cascade
更新部门后,对应部门里的员工表中的标识部门字段同步更新
级联删除:on delete cascade
删除部门后,对应该部门的员工表记录对应删除
''''

一对多

# 在一对多的表关联中,'多'为主关联表,'一'为被关联表
'''
站在两张表的角度:
1.站在员工表:一名员工是否可以属于多个部门 不可以
2.站在部门表:一个部门是否可以有多名员工 可以
双方只有一方是多对一的关系就是一对多
'''
 
# 代码实现创建关联表:
create table dep(
id int primary key auto_increment,
dep_name varchar(64),
dep_desc varchar(64)
);

create table emp(
id int primary key auto_increment,
name varchar(64),
gender enum('male','female','other') default 'male',
dep_id int,
foreign key(dep_id) references dep(id)
); # 插入记录
insert into dep(dep_name,dep_desc) values
('教学部','教书育人'),
('销售部','招学生'),
('技术部','技术攻关');
insert into emp(name,gender,dep_id) values
('小明','male',1),
('李雷','male',1),
('韩梅梅','female',2),
('小红','female',3);
 

多对多

# 在多对多关联表中,外键建在第三张表中
# 图书表与作者表之间的关系
'''
站在两张表的角度:
1.站在图书表:一本书是否可以有多个作者 可以
2.站在作者表:一个作者是否可以写多本书 可以
双方都能一条数据对应多条数据买这种关系就是多对多
'''
# 创建多对多关系表的方法
'''
1.设计第三张表,作为主关联表,此表中要有一个字段是图书id的外键,和一个字段是作者id的外键
2.先创建图书和作者这两种被关联表
3.再创建主关联表
'''
# 创建表
create table book(
id int primary key auto_increment,
name varchar(64),
price int
);
create table author(
id int primary key auto_increment,
name varchar(64),
gender enum('male','female','other')
);
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) references author(id)
on update cascade
on delete cascade
);
# 插入数据
insert into book(name,price) values
('斗破苍穹',''),
('python入门',''),
('MySQL基础',''),
('前端速成','');
insert into author(name,gender) values
('土豆','male'),
('韩梅梅','female'),
('李雷','male');
insert into book2author(book_id,author_id) values
(1,1),
(2,2),
(2,3),
(3,3),
(4,2);

一对一

客户表和学生表(报名之前数客户,报名之后是学生)

# 客户表记录唯一对应学生表中的一条记录,反之也一样
'''
站在两张表的角度
1.站在客户表:客户的一条记录对应学生的一条记录
2.站在学生表:学生的一条记录对应客户的一条记录
是一对一关联表
'''
# 创建一对一关联表 外键放在被频繁查询的表中并且外键为单列唯一
create table customer(
id int primary key auto_increment,
name varchar(64) not null,
qq int not null,
phone int not null
);
create into student(
id int primary key auto_increment,
name varchar(64) not null,
customer_id int unique, # 在一对一关联表中 此字段为唯一的
foreign key(customer_id) references customer(id)
on update cascade
on delete cascade
);
# 插入记录
insert into customer(name,qq,phone) values
('李雷','',''),
('韩梅梅','',''),
('小明','','');
insert into student(name,customer_id) values
('李雷',1),
('韩梅梅',2);

修改表

# MySQL 对大小写不敏感
语法:
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 旧字段名 新字段名 数据类型[约束条件];

复制表

# 查询语句执行结果也是一张表,可以看成虚拟表
# 复制表结构+记录 (主键,外键,索引不会被复制)
create table 新表名 select * from 被复制的表名;

# 只复制结构
select * from 表名 where 1=2;
create table 新表名 select * from 被复制的表名 where 1=2;
create table 表名 like employees;

MySQL 表之间的关系的更多相关文章

  1. mysql中相关,无关子查询,表与表之间的关系以及编码和乱码的解决

    ※MySQL中的字符编码(注意,utf8中没有'-',跟Java中不一样)SHOW VARIABLES; //查看系统变量//查询字符编码相关的系统变量SHOW VARIABLES WHERE var ...

  2. MySQL表与表之间的关系详解

    外键 说到表与表之间的关系就不得不说到一个关键词:外键 MySQ中的外键是什么,和表与表之间有什么关联? 外键(foreign key)又叫外连接, 在数据库中发挥着重要的作用 尤其是对于表和表之间的 ...

  3. MySQL数据库:SQL语句基础、库操作、表操作、数据类型、约束条件、表之间的关系

    数据库相关概念: 1. 数据库服务器:运行数据库管理软件的计算机 2. 数据库管理软件:MySQL.Oracle.db2.slqserver 3. 库:文件夹,用来组织文件/表 4. 表:文件(类似于 ...

  4. mysql 中表与表之间的关系

    如何找出两张表的对应关系 分析步骤: 1.先找出左表的角度去找 ​ 是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段 (通常是id) 2.再站 ...

  5. Mysql 表与表之间的关系

    一.前言 二.表与表之间的关系 (一) 一对多 (二) 一对一 (三) 多对多 一.前言 研究表与表之间的关系前,先要知道将所有数据存放在一张表中的弊端: 1.结构不清晰 ---> 不致命 2. ...

  6. MySQL如何找到表与表之间的关系?

    如何找到两张表之间的关系? 先站在左表的角度上去找,如果可以找到左表的多个字段可以对应右表的一个字段,那么左表的一个字段foregin key右表的一个字段.一般情况下为id... 2.如果右表的多个 ...

  7. MySQL表与表之间的关系

    表与表之间的关系 表1 foreign key 表2 则表1的多条记录对应表2的一条记录,即多对一 利用foreign key的原理我们可以制作两张表的多对多,一对一关系 多对多: 表1的多条记录可以 ...

  8. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  9. python 之 数据库(字段的约束条件,表之间的关系)

    10.6 约束条件 10.61 not null .default create table t15( id int, name ) not null, sex enum('male','female ...

随机推荐

  1. 修改Linux服务器中的MySql密码

    1.可以直接在数据库中修改,因为知道root密码,所以直接登录 mysql -uroot -p 2.查看一下数据库,修改root密码需要使用如下图所示的mysql数据库 3.通过use mysql指明 ...

  2. linux 加载新的磁盘(卷组)

    pvcreate /dev/vdbvgcreate datavg /dev/vdblvcreate -n datalv -L 99.8G datavgmkfs.ext3 /dev/datavg/dat ...

  3. NOIP2017[提高组] 宝藏 题解

    解析 我们观察范围可以发现n非常的小,(一般来说不是搜索就是状压dp)所以说对于这题我们可以用记忆化搜索或者dp,我们发现起点不同那么最终答案也就不同,也就是说答案是跟起点有关的,于是我们便可以想到去 ...

  4. 解决VS2017中使用scanf函数报错的问题

    我们在VS2017中如果使用C语言的scanf输入函数,编译的时候编译器会报error C4996: 'scanf': This function or variable may be unsafe. ...

  5. PAT(B) 1062 最简分数(Java)

    题目链接:1062 最简分数 (20 point(s)) 题目描述 一个分数一般写成两个整数相除的形式:N/M,其中 M 不为0.最简分数是指分子和分母没有公约数的分数表示形式. 现给定两个不相等的正 ...

  6. 史上最全最新java面试题合集二(附答案)

    下面小编整理了本套java面试题全集,分享给大家,希望对大家的java学习和就业面试有所帮助. 51.类ExampleA继承Exception,类ExampleB继承ExampleA. 有如下代码片断 ...

  7. Angular 学习笔记 immer 使用

    https://github.com/immerjs/immer#supported-object-types immer 是用来做 immutable 的. angular 的 change det ...

  8. centos可选的安装类型

    Desktop :基本的桌面系统,包括常用的桌面软件,如文档查看工具. Minimal Desktop :基本的桌面系统,包含的软件更少. Minimal :基本的系统,不含有任何可选的软件包. Ba ...

  9. windows + Eclipse 汉化

    https://www.eclipse.org/babel/downloads.php 下载Eclipse 对应版本 汉化包解压 复制文件夹里的内容到eclipse 文件夹下对应的文件里 重启ecli ...

  10. 简单记录一次注入到shell

    0x00 前言 帮朋友之前拿的一个站,有点久了没有完整截图,简单记录一下. 0x01 基础信息 操作系统:win 集成环境:phpstudy 端口开放:82,3306,3389 有phpmyadmin ...