mysql如何让表建立连接吗_MySQL 表与表之间建立关系

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

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

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

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

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

8f310717b8310b0998e32b6be321a684.png

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

一对多

第一步 拆分表

df23f5adf5535021ee7485a2e3613c3f.png

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

71a908a553853cc6974b7863bb93c708.png

注意: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 #同步删除

);

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

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

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

书与作者案例

ab522739e320977a9c720f6d26b08463.png

多对多案例实现

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);

一对一

b521253a720e54f59e3b09d63ad01623.png

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

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

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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

访客模式 无痕模式 区别_访客设计模式示例

访客模式 无痕模式 区别本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查…

项目经理升职了是啥_什么是升职率?

项目经理升职了是啥我确实相信您熟悉彼得原则 。 一般而言,该原则是一种观察,即晋升可能会并且将导致晋升人员不再符合工作资格的情况。 对于JVM,存在类似的问题。 太快地提升对象可能会对性能产生重大影响。 在这篇文章中,我们将…

mysql多表 性能_Mysql 多表联合查询效率分析及优化

1. 多表连接类型1. 笛卡尔积(交叉连接)在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用, 如:SELECT*FROMtable1CROSSJOINtable2SELECT*FROMtable1JOINtable2SELECT*FROMtable1,table2由于其返回的结果为被连接的两个数据表的乘积,因…

mysql事件定时_MySQL事件(定时任务)

whats the MySQL 事件MySQL5.1 版本开始引进 event 概念,MySQL 中的事件(event:时间触发器)是用于执行定时或周期性的任务,类似 Linux 中的 crontab,事件可以精确到秒。通过单独或调用存储过程使用,在某一特定的时间点…

lucene简介_Lucene简介

lucene简介本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中,您将了解Lucene。 您将了解为什么这样的库很重要,然后了解Lucene中搜索的工作方式。 此外,您将学习如何将Lucene Search集成到您自己的应用程序中&…

jsp mysql 插入数据_jsp连接MySQL实现插入insert操作功能示例

下午终于实现了jsp连接MySQL执行插入操作的功能。在index.jsp页面输入数据,提交到mysql——insert.jsp页面进行插入数据库的操作。index.jsp页面代码如下:request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8&…

swagger生成示例_生成器设计模式示例

swagger生成示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &…

mysql函数和索引冲突问题_Mysql索引常见问题汇总

Q1:数据库有哪些索引?优缺点是什么?1.B树索引:大多数数据库采用的索引(innoDB采用的是b树)。能够加快访问数据的速度,尤其是范围数据的查找非常快。缺点是只能从索引的最左列开始查找,也不能跳过索引中的列&#xff0c…

新增操作 失败后重试_可重试的操作

新增操作 失败后重试在我从事的每个项目中,始终需要某些功能:重试操作。 通常,这是关于通过网络的呼叫,该呼叫可能一次失败,但随后会成功。 它可能涉及许多其他内容,主要包括与另一个系统的通信&#xff08…

mysql uroot e_批量 kill mysql 连接

事故重现,并且加入一些后期想到的想法作为演义. 今天 mysql 服务器负载过高, 主库上主要是写的操作,首先看有没有锁表的,发现没有.mysql -uroot -e "show processlist"|grep -i locked|wc -l再看delete,update,insert操作的数量.mysql -uroot -e "show process…

设计模式适配器模式_适配器设计模式示例

设计模式适配器模式本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &…

mysql mgr bug_Mysql MGR架构误操作引发的问题处理

【背景介绍】故障方描述:一次用户刷权限的时候不小心把数据库用户表记录删掉了,执行之后发现不对后重建用户,杀掉进程后重新MGR启动报错。【报错信息】2018-06-13T12:47:41.405593Z 32 [Note] Plugin group_replication reported: Group comm…

css外墙法_外墙设计模式示例

css外墙法本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff0…

向 mysql导入数据 源码_MySQL 导入数据

MySQL 导入数据MySQL中可以使用两种简单的方式来导入MySQL导出的数据。使用 LOAD DATA 导入数据MySQL 中提供了LOAD DATA INFILE语句来插入数据。以下实例中将从当前目录中读取文件 dump.txt ,将该文件中的数据插入到当前数据库的 mytbl 表中。mysql> LOAD DATA …

设计模式示例_桥梁设计模式示例

设计模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

数值分析 使用c语言 源码_分析源码,学会正确使用 Java 线程池

在日常的开发工作当中,线程池往往承载着一个应用中最重要的业务逻辑,因此我们有必要更多地去关注线程池的执行情况,包括异常的处理和分析等。本文主要聚焦在如何正确使用线程池上,以及提供一些实用的建议。文中会稍微涉及到一些线…

设计模式示例_状态设计模式示例

设计模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

cam350 不能打开光绘文件_如何在CAM350中导入Allegro光绘

内容简介:本人之前遇到过 CAM350 导入 Allegro 格式光绘后钻孔偏移、异型孔不显示的问题,捣鼓过之后找到一个方法,在 Allegro 群友的建议下制作该文档进行适当的说明。1. 导入 Gerber 文件鉴于手工导入 Gerber 文件需要逐层设置,过…

mockito验证参数_Mockito验证

mockito验证参数本文是我们名为“ 用Mockito测试 ”的学院课程的一部分。 在本课程中,您将深入了解Mockito的魔力。 您将了解有关“模拟”,“间谍”和“部分模拟”的信息,以及它们相应的存根行为。 您还将看到使用测试双打和对象匹配器进行验…

d3js mysql_D3.js入门指南

近期略有点诸事不顺,趁略有闲余之时,玩起D3.js。之前实际项目中主要是用各种chart如hightchart、echarts等,这些图形库玩起来貌都是完美的,一切皆可配置,但几年前接触了D3之后,觉得前面那chart类库局限的地…