首页 > 数据库 >MySQL

MySQL

时间:2022-08-16 19:24:38浏览次数:44  
标签:name int 32 dep key MySQL id

今日内容

约束条件之外键

外键前戏

需要创建一张员工表
	id	name	gender	dep_name	dep_desc

上述表的缺陷
	1.表结构不清晰 到底是员工表还是部门表(不严重 无所谓)
	2.字段数据反复存取 浪费存储空间(不严重 无所谓)
	3.表的扩展性极差 牵一发动全身(很严重 效率极低)

优化操作>>>:拆表
	id	name 		gender
	id	dep_name	dep_desc
	拆表之后解决了上述的三个问题 但是出现一个致命的缺陷

解决措施
	id	name	gender	dep_id
	添加一个部门编号字段填写部门数据的主键值

Foreign Key

外键字段 专门用于记录表与表之间数据的关系

1.先写普通字段
2.然后在写外键字段

create table emp(
    id int primary key anto_increment,
    name varchar(32),
    gender enum('male','female','others') default 'male'
    dep_in int,
    foreign key(dep_id) references dep(id)
);

create table dep(
    id int primary key auto_increment,
    dep_name varchar(32),
    dep_desc varchar(32)
);

"""
1.创建表的时候需要先创建被关联的表(没有外键) 然后再是关联的表(有外键)
2.插入表数据的时候 针对外键字段只能填写被关联表字段已经出现(存在)过的数据值
3.被关联字段无法修改和删除
	有点不好 操作限制性太强
"""

级联更新、级联删除

被关联数据一旦变动 关联的数据同步变动

create table emp1(
    id int primary key auto_increment,
    name varchar(32),
    gender enum('male','female','others') default 'male',
    dep_ip int,
    foreign key(dep1_id) references dep1(id)
    on update cascade  # 级联更新
    on delete cascade  # 级联删除
);

create table dep1(
    id int primary key auto_increment,
    dep_name varchar(32),
    dep_desc varchar(32)
);

"""
扩展:
    在实际工作中 很多时候可能并不会使用外键
        因为外键增加了表之间的耦合度 不便于单独操作 资源消耗增加
    我们为了能够描述出表数据的关系 又不想使用外键
        自己通过写SQL 建立代码层面的关系
"""

表关系之一对多

表数据的关系判定 >>>:换位思考

针对员工表和部门表的判断数据

1.先站在员工表的角度

问:一条员工数据能否对应多条部门数据
翻:一名员工能否属于多个部门
答:不可以

2.再站在部门表的角度
问:一条部门数据能否对应多条员工数据
翻:一个部门能否拥有多个员工
答:可以

完成换位思考之后得出的答案 一个可以一个不可以
那么表关系就是"一对多"
部门是一 员工是多
针对'一对多'的关系 外键字段建在多的一方

ps:没有多对一 统一称为'一对多'

create table emp1(
    id int primary key auto_increment,
    name varchar(32),
    gender enum('male','female','others') default 'male',
    dep_ip int,
    foreign key(dep1_id) references dep1(id)
    on update cascade  # 级联更新
    on delete cascade  # 级联删除
);

create table dep1(
    id int primary key auto_increment,
    dep_name varchar(32),
    dep_desc varchar(32)
);

表关系之多对多

以书籍表和作者表为例

1.先站在书籍表的角度
问:一条书籍数据能否对应多条作者数据
答:可以

2.再站在作者表的角度
问:一条作者数据能否对应多条书籍数据
答:可以

总结:两边都可以 那么表数据关系就是'多对多'
针对多对多表关系 外键字段不能建在任意一方!!!
需要单独开设第三张关系表 存储数据的关系

create table book(
    id int primary key auto_increment,
    title varchar(32)
);

create table author(
    id int primary key auto_increment,
    name varchar(32)
);

create table book2author(
    id int primary key auto_increment,
    book_id int,
    foregn key(book_id) references book(id)
    on update cascade   # 级联更新
    on delete cascade,  # 级联删除
    author_id int,
    foreign key(author_id) referenes author(id)
    on update cascade  # 级联更新
    on delete cascade  # 级联删除
);

表关系之一对一

以用户表和用户详情表

1.先站在用户表的角度
问:一个用户数据能否对应多个用户详细数据
答:不可以

2.再站在用户详情表的角度
问:一个用户详细数据能否对应多个用户数据
答:不可以

总结:两边都不可以 那么先考虑是不是没有关系
如果有关系那么肯定就是'一对一'
针对'一对一'的表关系 外键字段建在任何一张表都可以 但是更推建在查询频率较高的表中便于后续查询

create table user(
    id int primary key auto_increment,
    name varchar(32),
    datail_id int unique,
    foreign key(datail_id) references userDetail(id)
    on update cascade  # 级联更新
    on delete cascade  # 级联删除
);

create table usserDetail(
    id int primary key auto_increment,
    phone bignt,
    age int,
    addr carchar(32)
);

标签:name,int,32,dep,key,MySQL,id
From: https://www.cnblogs.com/lisony/p/16592664.html

相关文章

  • MySQL多表查询
    多表连接的方式有四种:内连接外连接**全连接子查询SQL92语法1992年的语法。--查询学号,姓名,年龄,分数,通过多表连接查询,student和scores通过id和s_id连接SELECT st......
  • 【MySQL】分组GROUP BY
    目录1.GROUPBY分组使用2.使用多个列分组3.GROUPBY中使用WITHROLLUP1.GROUPBY分组使用例:求员工表中各部门的平均工资使用GROUPBY子句将数据按部门分SELECT depa......
  • 动手实验查看MySQL索引的B+树的高度
    一:简化几个概念:h:统称索引的高度;h1:聚簇索引的高度;h2:二级辅助索引的高度;k:中间结点的扇出系数。二:索引结构叶子节点其实是双向链表,而叶子节点内的行数据是单向链表,该......
  • 如何解决生产环境MySQL的死锁问题
    生产问题云服务上的生产环境中发现我们数据库出现了一个异常,异常堆栈信息如下:Errorupdatingdatabase.Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRol......
  • mysql问题记录:varchar字段存数字加了索引,导致between速度非常慢,走了全表扫描
    在字段类型为varchar并且是数字的时候,此时使用betweennum1andnum2。会导致不走索引。原因是因为当条件是数字的时候,mysql会将varchar字段先转换为数值,然后进行比较。......
  • 【sql效率优化】优雅地解决mysql深分页问题
    背景日常需求开发过程中,数据库开发是必不可少的,大家应该都习惯将数据库部署在虚拟机上吧,那么相信大家对于limit一定不会陌生,但是使用limit时,当偏移量(offset)非常大时,会发现......
  • MySQL---索引
    索引下推:概念:索引下推(IndexConditionPushdown,简称ICP),实质上就是指将部分上层(服务层)负责的事情,交给了下层(引擎层)去处理。是MySQL5.6版本的新特性,它能减少回......
  • 解决Redis、MySQL缓存双写不一致问题
     redis、mysql双写缓存不一致: 但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存。又或者是先删除缓存,再更新数据库,其实大家存在很大的争议。目前没有一......
  • MySQL三
    约束条件之主键约束条件之外键操作表的SQL语句补充今日内容详细约束条件1.primarykey主键 1.单从约束角度上而言主键等价于非空且唯一notnullunique cr......
  • MySQL的约束条件,约束条件主键,外键,foieign key,表关系(多对一,多对多,一对一)
    MySQL的约束条件约束条件回顾约束条件之主键主键的作用primarykeyInnoDB存储引擎规定主键单列主键和联合主键auto_increment自增自增的特点......