多表关联

摘要:
#首先,创建主表。主表引用没有外键的表createtabledpt#部门表没有外键,员工表有外键-˃createtableemp;Mysql˃#首先将数据插入主表,然后插入辅助表-˃insertitodptvalues,;mysql˃插入empvalues,,,;#要插入从属表的数据的外键必须是主表,然后才能插入。对于一对多关系,需要确定主表和从属表。多对多关系的例子是多对多的关系,即创建一个从属表,其中学生表和教师表作为主表,关系表作为从属表。一般来说,如果要删除主表中的一条数据,则需要删除或修改辅助表中的所有相关数据才能正确删除它。

为什么建立分表

只使用一个表的话:

  1.重复数据,浪费空间

  2.数据结构混乱

  3.扩展性差

什么时候分表

  当出现大量重复数据时

  当一条记录中的数据 不属于同一类时

 

分表之后,几个表之间存在内在的关系,就需要联合在一起,就会存在:多对多,一对多,一对一的关系。

必须找到一种方法,可以在物理层面建立关联关系

  解决方案:外键约束

外键约束的具有的约束

第一种约束:先建主表,再建从表

第二种约束:先插入主表,插入从表

第三种约束:先删从表记录,再删主表记录

第四种约束:从表更新外键,必须保证外键存在

第五种约束:更新主表的id时,必须先删除从表关联数据

第六中约束:删除主表,要先删除从表。

有了这几个约束后,主表和从表中的数据必然是完整的

一对多的关系的实例

多表关联第1张

员工与部门的关系,一个部门可以有多个员工。员工只有一个部门。

#先建立主表,主表指的是没有外键的表

create table dpt(id int primary key auto_increment,name char(10));

#部门表没有外键,员工表有外键

-> create table emp (id int primary key auto_increment,name char(10),dpt_id int,
-> foreign key (dpt_id) references dpt(id));

mysql> #数据插入先主表,后从表
-> insert into dpt values (null,"市场部"),(null,"人事部");

mysql> insert into emp(name,dpt_id) values ("张三丰",1),("扫地僧",2),('张无忌',1),("虚竹",2);

#插入从表的数据的外键必须是主表有的才可以插入

多表关联第2张

对于一对多的关系,建立联系,需要确定其中主表,与从表。主表再逻辑上是先于从表的数据生成的。

多对多的关系的实例

多表关联第3张

多对多的关系,是建立一张从表,将学生表和老师表作为主表,关系表作为从表。

create table teacher (id int primary key auto_increment,name char(10),salary int,course char(10));

create table student (id int primary key auto_increment,name char(10));

mysql> create table tsr (id int primary key auto_increment,tid int,sid int,
-> foreign key (tid) references teacher(id),
-> foreign key (sid) references student(id));

insert into teacher(name,salary,course) values ("egon",30000,"python"),("hu",20000,"python");

insert into student(name) values ("msj"),("lyh");

 insert into tsr(tid,sid) values (1,1),(1,2),(2,1),(2,2);

多表关联第4张

多表关联第5张

一对一的关系实例

多表关联第6张

常用信息与详细信息之间的关系就是一对一,一对一除了外键需要添加,还需要添加唯一性表示符。

 create table basic_info (id int primary key auto_increment,name char(10),gender enum("m","w"),age int);

create table det_info (id int primary key auto_increment,height int,weight int,b_id int unique,
-> foreign key (b_id) references basic_info(id));

insert into basic_info values(null,"杨元虎","m",18)

insert into det_info values (null,180,75,1);

多表关联第7张

级联约束

对于主表数据的操作可能影响到从表的数据(从表的外键与主表的主键紧密关联),所以外键约束对主表的删除和修改都会严格要求。

一般来说想要删除主表中一条数据,需要将从表中的相关的数据全部删除或修改,才能正确删除。

这是就有了级联约束。

设置 on delete cascade

  on update cascade

on delete cascade 当主表删除记录时 从表相关联的记录同步删除
on update cascade 当主表id更新时 从表相关联的记录同步更新
注意是单向的 主表变化是 级联操作从表 从表的变化不会级联到主表

 

免责声明:文章转载自《多表关联》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【转】mac 安装Homebrew提示brew command not found错误的解决方法.NET Core分布式事件总线、分布式事务解决方案:CAP下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

在EggJS中使用Sequelize做联表查询

内容转自https://www.jianshu.com/p/078087c69b77,感谢 1.EggJS引用Sequelize 安装sequelize依赖和mysql驱动 cnpm i egg-sequelize mysql2 -S 启用sequelize插件   在config/plugin.js里面添加 sequelize: { enable...

更改mysql引擎后无法建立外键(navicat)

当我们使用navicat添加外键时,提示如下错误 首先考虑以下原因: 1:两个字段的数据类型和长度不匹配:例如一个是int一个是bigint 2:外键所参考的字段必须为主键 3:要设置外键的字段不能为主键 4:mysql表的引擎必须得是innodb(因为mysql默认引擎为MyISAM,但如果是这种情况的话,navicat不会报错,只会默默建立索引而不建...

MySQL之关系映射

数据库的关系一般是用于描述多张表之间的关系。 主要分为: 一对一 一对多 多对多 而不管表与表之间是哪种关系,在创建关联时都需要通过外键(FOREIGN KEY)进行约束,以保证数据的统一性。外键通常都是与另一张表的主键进行关联的。 一、一对一关系一对一关系是指一张表中的一条数据对应另一张表中的唯一一条数据。 例如下面的用户与用户详情表。 用户表: C...

MySQL(一) 数据表数据库的基本操作

      序言         这类文章,记录我看《MySQL5.6从零开始学》这本书的过程,将自己觉得重要的东西记录一下,并有可能帮助到你们,在写的博文前几篇度会非常基础,只要动手敲,跟着我写的例子全部实现一遍,基本上就搞定了,前期很难理解的东西基本没有,所以写博文的内容,就是以练题的形式来呈现的。             需要用的资料以链接的形式给需...

MySQL规约(阿里巴巴)

建表规约 【强制】表达是与否概念的字段,必须使用 is _ xxx 的方式命名,数据类型是 unsigned tinyint ( 1 表示是,0 表示否 ) ,此规则同样适用于 odps 建表。说明:任何字段如果为非负数,必须是 unsigned 。 【强制】表名、字段名必须使用小写字母或数字 ; 禁止出现数字开头,禁止两个下划线中间只 出现数字。数...

MySQL连表操作之一对多

引入 当我们在数据库中创建表的时候,有可能某些列中值内容量很大,而且重复。 例子:创建一个学生表,按学校年纪班级分,表的内容大致如下: id name partment 1 xxx x学校x年级x班级 2 ooo x学校x年级x班级 3 zzz z学校x年级x班级 4 ddd y学校x年级x班级 我们看出来对应的partment对应...