表之间的关系

foreign key

外键约束,用于指向另一个表的主键字段

# 创建表的时候添加外键

create table teacher(

id int primary key auto_increment,

name char(20),

gender char(1),

dept_id int,

foreign key(dept_id) references dept(id)

);

解释:

foreign key(dept_id) references dept(id)

dept_id 表示当前表的外键字段

dept 表示要关联哪个表

dept(id) id表示关联的dept表的id字段

主表与从表

先有主表 再有从表

先有dept 再有teacher

foreign key 带来的约束作用:

1.在从表中插入一条记录,关联了一个主表中不存在的id 导致插入失败

必须保证部门id (外键的值) 必须是在主表中存在的

2.插入数据的顺序

​ 先插入主表记录 在插入从表记录

3.从表更新外键时也必须保证 外键的值在主表中是存在的

4.删除主表记录前 要保证从表中没有外键关联被删除的id

​ delete from dept where id = 1;# 报错

​ 必须先删除从表 再删除主表

​ delete from teacher where dept_id = 1;

​ delete from dept where id = 1;

5.更新主表记录的主键时 要保证从表中没有外键关联被删除的id

6.必须先创建主表

7.删除表 必须先删除从表

强调:foreign key就是用来保证两张表之间的关联关系是正确的!

练习: 班级表 和 学员表

主表是班级

从表是学员 外键加给学员

create table class(

id int primary key auto_increment,

name char(20)

);

create table student(

id int primary key auto_increment,

name char(20),

gender char(1),

c_id int,

foreign key(c_id) references class(id)

);

级联操作 cascade

当我们需要删除部门(主表)信息 时,必须先删除从表中关联的数据,很麻烦

级联操作指的就是,当你操作主表时,自动的操作从表

两种级联操作

1.级联的删除

​ 当删除主表时自动删除从表中相关数据

2.级联更新

​ 当主表的主键更新时自动的更新关联的从表数据

案例:以上面的班级个学员为例:

drop table if exists class;

# 如果这表存在 才执行删除 可以避免报错 if exists

# if not exists 如果不存在才执行

create table class(

id int primary key auto_increment,

name char(20)

);

insert into class values(null,"py9");

insert into class values(null,"py10");

#创建表的时候指定级联操作

drop table if exists student;

create table student(

id int primary key auto_increment,

name char(20),

gender char(1),

c_id int,

foreign key(c_id) references class(id)

on update cascade

on delete cascade

);

# 级联操作可以单独使用 也可以一起使用 空格隔开即可

insert into student values(null,"jack","m",1);

insert into student values(null,"rose","m",1);

insert into student values(null,"tom","m",2);

外键的使用

什么时候使用外键:

​ 表之间存在关联关系 ,

首先要确定表之间的关系:

多对一

​ 一对多(多对一)

或者

老师和部门的关系

老师的角度看

一个老师应该对应有一个部门

一个老师可以对应对多个部门? 不行 一个老师只能属于一个部门 (要看具体业务要求)!

多个老师可以对应一个部门

多对一

部门的角度看

一个部门可以对应多个老师

一个部门可以对应一个老师

多个部门可以对应一个老师? 不行

一对多

如何处理一对多(多对一)?

在老师表中存储 部门id

即多的一方存储 一的一方的id

处理方式

​ 在一的一方即teacher表中保存相应部门(多的一方)的编号;

案例:

#部门:

create table dept(

id int primary key auto_increment,

name char(20),

job char(50),

manager char(10)

);

#老师表:

create table teacher(

id int primary key auto_increment,

name char(20),

gender char(1),

dept_id int,

foreign key(t_id) references teacher(id),

);

mysql表的级联操作_mysql表之间的关系及级联操作相关推荐

  1. mysql表操作_MySQL表操作语句用法百科

    本文采用MySQL5.7.26版本 1 建表语句 建表语句create语法如下: 1.1 设置unsigned unsigned设置数值类型是否为无符号数,可以为空,如下举例: 1.2 设置默认值 d ...

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

    引子:如下图是一张非常寻常的表格,在以前的工作中实常会制作类似的表格,但是今天的数据库内容,将我之前这种传统的制表思路上升了一个层次: 今天核心的内容就是怎样让表与表之间产生关系,在思考这个问题的时候 ...

  3. mysql表文件被删_mysql表物理文件被误删的解决方法

    前言 1.该方法只介绍了如何救回这个表名(数据不恢复) 如果想要恢复原来数据 直接用extundelete把文件恢复后放回去即可 2.并且是适用于平时没有全备的情况下  如果有全备 直接那全备的frm ...

  4. mysql为什么要重建索引_MySQL表索引为什么会遭破坏?

    此文章主要向大家描述的是MySQL表索引被破坏的问题的产生缘由,以及针对这一问题我们给出其具体的解决方案,下面的文章就是对其相关内容的具体介绍,希望在你今后的学习中会有所帮助. 下午上班,惊闻我的de ...

  5. mysql创建外键级联更新_MySQL中利用外键实现级联删除、更新

    MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作 ...

  6. mysql中外键设置级联删除_MySQL中利用外键实现级联删除、更新

    MySQL中利用外键实现级联删除.更新 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在 创建索引的时候,可以指 ...

  7. 从块结构谈表的存储参数与性能之间的关系

    摘要:自从开始在微信公众号写点小东西,老白每天早上到公司的第一件事是洗手.泡茶.看方方的武汉日记,然后就想今天写点 自从开始在微信公众号写点小东西,老白每天早上到公司的第一件事是洗手.泡茶.看方方的武 ...

  8. cdn与服务器的关系_域名解析、CDN 加速、服务器绑定域名之间的关系及如何操作?...

    域名解析.CDN 加速和服务器绑定域名之间的关系是什么?又是如何操作的呢?对于很多新同学来说,经常会把域名解析.CDN 加速和服务器端 IP 弄混淆.在和新同学沟通的过程中,老魏发现部分同学是越听脑子 ...

  9. mysql一张表可以用吗_MySQL表操作

    一.存储引擎 不同的数据应该有不同的处理机制 mysql存储引擎: Innodb:默认的存储引擎,查询速度较myisam慢,但是更安全 myisam:mysql老版本用的存储引擎 memory:内存引 ...

最新文章

  1. Linux定时程序没有之行完,如何在linux上定时执行程序
  2. 本地jar文件中搜索class
  3. hihocoder 1638:多级并查集
  4. Testng 测试框架源码阅读(二)
  5. Fix error message: maven error: package org.junit does not exist
  6. 扎心!程序员泪奔的8个瞬间
  7. 开发环境 Minio 添加桶的操作流程-页面操作
  8. mybatis 逆向工程生成的 Example 类的使用
  9. Java IO流总结
  10. python 状态模式_使用状态模式自由切换登录状态
  11. 二十三种设计模式详解
  12. 对中文版“Siri”打个招呼吧!
  13. python自动生成报告_python实现自动生成oracle awr报告
  14. unix环境高级编程——UNIX体系架构
  15. magisk下载里显示没有模块_magisk框架
  16. jquery 3D旋转banner图效果 demo
  17. 2021年IT互联网高薪职位大盘点
  18. c++中rand(),srand()使用
  19. Android App内存泄露测试方法总结
  20. IO流原理及流的分类

热门文章

  1. 华为手机媒体音量自动静音_华为手机还能自动清理垃圾,怪不得手机越用越流畅,学到了...
  2. 4,GIL全局解释器锁,event事件,信号量
  3. JavaScript中的parseInt和Number函数
  4. MySQL---InnoDB引擎隔离级别详解
  5. swap,交换,第三随笔
  6. Apache Shiro 使用手册(五)Shiro 配置说明
  7. 实现三联tab切换特效
  8. 实例构造器与类型构造器
  9. 数学趣题——求圆周率的近似值
  10. Debian下使用OpenLDAP