博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql表之间的关系及级联操作
阅读量:4444 次
发布时间:2019-06-07

本文共 2600 字,大约阅读时间需要 8 分钟。

表之间的关系

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

外键的使用

什么时候使用外键:

​ 表之间存在关联关系 ,

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

多对一

​ 一对多(多对一)

o_1111.png

或者

o_222.png

老师和部门的关系 老师的角度看    一个老师应该对应有一个部门     一个老师可以对应对多个部门?  不行 一个老师只能属于一个部门 (要看具体业务要求)!    多个老师可以对应一个部门     多对一部门的角度看    一个部门可以对应多个老师    一个部门可以对应一个老师    多个部门可以对应一个老师? 不行     一对多 如何处理一对多(多对一)?    在老师表中存储 部门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),    );

转载于:https://www.cnblogs.com/chuwanliu/p/11177308.html

你可能感兴趣的文章
SQL Server 代理 开机自动运行
查看>>
thinkphp前台html格式化输出日期
查看>>
线搜索(line search)方法
查看>>
代码动态修改材质球的颜色
查看>>
c# 动态绘制直线和曲线
查看>>
【转】三大UML建模工具Visio、Rational Rose、PowerDesign的区别
查看>>
下暴你的硬盘 超多游戏下载 不爆你找我!
查看>>
团队编程项目作业6-程序维护
查看>>
CentOS 7.0关闭默认防火墙启用iptables防火墙
查看>>
转载Ajax.Net--ScriptManager和UpdatePanel控件
查看>>
[leetCode]Linked List Cycle I+II
查看>>
使用Guava retryer优雅的实现接口重调机制
查看>>
leetcode中的python学习
查看>>
sqlserver打开对象资源管理器管理的帮助文档的快捷键
查看>>
php 解决乱码的通用方法
查看>>
spring aop annotation
查看>>
RSA加密解密及RSA签名和验证
查看>>
解题报告:hdu1257 LIS裸题
查看>>
P2939 [USACO09FEB]改造路Revamping Trails
查看>>
Add some compression to your program
查看>>