引子:如下图是一张非常寻常的表格,在以前的工作中实常会制作类似的表格,但是今天的数据库内容,将我之前这种传统的制表思路上升了一个层次;

今天核心的内容就是怎样让表与表之间产生关系,在思考这个问题的时候,我们可以回顾之前学习python时,当一个任务涉及到很多的功能时,我们为了

让程序的结构更清晰,扩展性更高,我们选择用函数>>模块>>包 的方式将功能层层拆分,最终让程序结构上升到新的层次,而且极大的降低了代码的冗

余。再回到这张表,如果说总共就这几个人,这张表没什么问题,但是假设我们拥有100w的用户,此时表中的 def_name,dep_desc就有些冗余了;此外

这种表的形式也非常不利于后期数据的取值和修改。

实现思路:把内容多出现重复的字段拎出来制作成具有id的新表,将两张表建立联系。

一对多

第一步 拆分表

第二步 建立关联(通过dep_id字段链接两张表)

注意:1.必选要先建被关联表;

2.新增数据的时候,要先增被关联表中的数据;

create table dep(

id int primary key auto_increment,#id设置为主建,自增

dep_name char(16),

dep_desc char(64) #注意最后一个括号后面一定不要加逗号!

);

create table emp(

id int primary key auto_increment,

name char(16),

gender enum('male','female','others') not null default 'male', #default后面的默认值空格直接书写即可

dep_id int,

foreign key(dep_id) references dep(id)#外键 本表中的dep_id 字段 ,关联dep表中的id字段;

);

插入数据

2.新增数据的时候,要先增被关联表中的数据

insert into dep(dep_name,dep_desc) values

('外交部','形象代言人'),

('教学部','教书育人'),

('技术部','技术能力有限部门');

insert into emp(name,gender,dep_id) values

('jason','male',1),

('egon','male',2),

('kevin','male',2),

('tank','male',2),

('jerry','female',3);

修改dep_id 数据

update emp set dep_id=100 where id=1; #修改dep_id数据 结果报错。

但我们可以选择先删除关联表中的数据后,再更改与其关联表emp中的字段。但这

并不是最好的解决办法

第三步 深度关联(修改/删除同步)on update cascade on delete cascade

create table dep(

id int primary key auto_increment,

dep_name char(16),

dep_desc char(64)

);

create table emp(

id int primary key auto_increment,

name char(16),

gender enum('male','female','others') not null default 'male', #default后面的默认值空格直接书写即可

dep_id int,

foreign key(dep_id) references dep(id)

on update cascade#同步更新

on delete cascade #同步删除

);

多对多(第三张表牵线搭桥)

当我们面对的是两张表互相之间都是多对一的情况,也就是多对多的情况时,就会出现互为外键,如果还是安装上面的方法创建,就会出现无法创建表的情况。此时我们需要第三张表来作为中间人,

为两张表牵线搭桥,让它们产生关联。

书与作者案例

多对多案例实现

create table book(

id int primary key auto_increment,

title char(16),

price int

);

create table author(

id int primary key auto_increment,

name char(16),

gender char(16)

);

create table book2author(

id int primary key auto_increment,

book_id int,

author_id int,

foreign key(book_id) references book(id)

on update cascade#同步更新

on delete cascade, #同步删除

foreign key(author_id) references author(id)

on update cascade#同步更新

on delete cascade #同步删除

);

插入数据

insert into book(title,price) values

('瓶金梅','69.96'),

('围城','99.99'),

('python全栈开发','21000');

insert into author(name,gender) values

('jason','male'),

('egon','female'),

('kevin','male');

insert into book2author(book_id,author_id) values

(1,1),

(1,2),

(1,3),

(2,1),

(2,3),

(3,1),

(3,2);

一对一

客户表和学生表(老男孩的客户与学生之间,报名之前都是客户,只有报了名的才能是学生)

#左表的一条记录唯一对应右表的一条记录,反之也一样

create table customer(

id int primary key auto_increment,

name char(20) notnull,

qq char(10) notnull,

phone char(16) notnull

);

create table student(

id int primary key auto_increment,

class_name char(20) notnull,

customer_id int unique,#该字段一定要是唯一的

foreign key(customer_id) references customer(id) #外键的字段一定要保证unique

on delete cascade

on update cascade

);

修改表

语法:

1. 修改表名

ALTER TABLE 表名

RENAME 新表名;

2. 增加字段

ALTER TABLE 表名

ADD 字段名  数据类型 [完整性约束条件…],

ADD 字段名  数据类型 [完整性约束条件…];

ALTER TABLE 表名

ADD 字段名  数据类型 [完整性约束条件…]  FIRST;

ALTER TABLE 表名

ADD 字段名  数据类型 [完整性约束条件…]  AFTER 字段名;

3. 删除字段

ALTER TABLE 表名

DROP 字段名;

4. 修改字段

ALTER TABLE 表名

MODIFY  字段名 数据类型 [完整性约束条件…];

ALTER TABLE 表名

CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];

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如何让表建立连接吗_MySQL 表与表之间建立关系相关推荐

  1. mysql数据库表的连接查询_mysql数据库多表连接查询问题

    我有5个表 chanet_cmiims_person_info表 chanet_cmiism_person_commitstate表 chanet_cmiims_commitstate_type表 c ...

  2. mysql 三个表内连接查询_MySQL多表查询详解

    多表查询 1. 表与表之间的关系 <1> 一对一 用户表和身份信息表,用户表是主表 男人表.女人表 create table man( mid int primary key auto_i ...

  3. mysql获取多张表中的数据_mysql 之多表查询

    阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建一个数据库,那数据库里 ...

  4. mysql全表重命名备份_Mysql数据库和表的常用操作以及数据备份恢复

    数据库 查看所有数据库 show databases; 使用数据库 use 数据库名; 查看当前使用的数据库 select database(); 创建数据库 create database 数据库名 ...

  5. mysql多表查询注意事项_MySQL的多表查询

    一.表的加法 关键词union和union all 用来合并表,其中,union 去重,union all 不去重. 例如:将course和course1两张表合并 两张表的数据分别如图所示:cour ...

  6. mysql中表与表的关系代码_mysql 中表与表之间的关系

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

  7. mysql表分区占用存储_MySQL 分区分表应用场景分析和分区中可能遇到的坑点

    MySQL的分区和分表应用场景分析 在日常工作中当我们的某张表的数据量过大的时候,首当其冲的可能就是进行分区和分表,但是是如何分区或者分表都要结合一点的业务场景下进行分析,才会显著的提升性能,来聊一聊 ...

  8. mysql快速删除大表数据部分数据_mysql删除大表的部分数据

    mysql删除大表的部分数据 好久没写博客.最近项目要上线.下班时间还得陪着老妈.实在没时间更新. 今天有人提了一个问题,  www.2cto.com 一个表有1亿6000万的数据,有一个自增ID.最 ...

  9. mysql获取多张表中的数据_mysql之多表查询

    1.新建的一个数据库db3 create database db3 charset utf8; 2.为db3数据库创建两张表和数据 (1)创建person表 create tableperon ( i ...

最新文章

  1. struts2.2.3需包含的jar包
  2. python朗读网页-早上起床后不想动,让 Python 来帮你朗读网页吧
  3. 使用git命令行将某个指定文件回退到前几个版本
  4. 无法加载具有重复项目项的项目: pathstroke.cpp 作为 ClCompile 且作为 None 项类型包括在其中。
  5. Redis的RDB文件与AOF文件
  6. 正月初四 | 2月15日 星期一 | 特斯拉否认推出16万元更便宜车型;中国首位百亿票房导演诞生;冷光烟花纳入烟花爆竹管理...
  7. windows环境下memcache服务器使用经验
  8. 2021江苏南通名师高考成绩查询,2021南通市地区高考成绩排名查询,南通市高考各高中成绩喜报榜单...
  9. Ubuntu系统运行darknet出OSError: /libdarknet.so: cannot open shared object file: No such file or directory
  10. 做Web应用程序时应该如何面向对象杂谈
  11. 十大经典排序算法整理汇总(附代码)
  12. Android 系统各个版本上https的抓包
  13. SpringBoot 中使用 QuzartZ
  14. WPF实现鼠标拖动框选功能
  15. IDEA 实用小技巧:万能的临时文件
  16. 重温51汇编指令(附实验)
  17. C语言执行时进行窗口隐藏
  18. 橙子钱包app是谁做的?
  19. linux c字符串-指针
  20. 详细功能描述及代码带您快速接入百度大脑通用文字识别

热门文章

  1. java实现metro风格_Metro风格的Java组合框(JMetro)–重新介绍
  2. 线程同步,线程不同步_重新同步多线程集成测试
  3. javafx游戏_JavaFX游戏(四连环)
  4. 难题:嵌套computeIfAbsent
  5. Java构建工具:Ant vs. Maven vs Gradle
  6. Java 8日期时间API教程:LocalDateTime
  7. JavaFX中的塔防(4)
  8. 通过JNI使用C ++尖叫快速进行Lucene搜索
  9. Java垃圾回收(1)
  10. Spring Data Solr教程:配置