概念

关键字:foreign key,也叫做外键约束!

如果一个实体A的某个字段,刚好指向另一个实体B的主键,那么实体A的这个字段就叫做外键;

所以,简单来说,外键就是本表的某个字段指向外表的主键!

上面的,学生表中的班级字段其实就是一个外键!

其中,被指向的实体集(班级表),叫做主实体集(主表),也叫做父实体集(父表),负责指向的实体集(学生表),叫做从实体集(从表),也叫做子实体集(子表)

作用

外键的意义就是用来约束关系内的实体!

为什么需要有外键约束,因为需要在插入记录的时候,保证其符合现实中的正常的逻辑关系:

假如上面的有一个学生的班级字段里面出现了11班,就不符号逻辑,因为班级表中根本就没有11班!

所以,外键的约束主要体现在以下的两个方面:

1,  增加子表记录的时候,需要判断是否有与之对应的父表记录!

2,  当删除或更改父表记录的时候,子表应该如何处理相关的记录!

定义

应该在从表的某个字段上增加一个外键属性用于执行主表的主键!

 -- 定义父表
create table web_class(
class_id int unsigned primary key auto_increment,
class_teacher varchar(20) not null
); -- 定义子表
create table web_student(
stu_id int unsigned primary key auto_increment,
stu_name varchar(20) not null,
stu_home varchar(100),
stu_class_id int unsigned,
-- 定义外键
foreign key(stu_class_id) references web_class(class_id)
);

设置级联操作

级联操作(关联动作):操作一张表,影响另一张表
1.主表更新
语法形式: on update[级联操作]
2.主表删除
语法形式: on delete[级联操作]

上面的级联操作常见的都有三种形式:
cascade: 同步操作,串联操作,也就是当主表的字段更新或者删除的时候
从表的外键也进行删除或者更新

set null: 设置为空,也就是当主表的字段更新或者更新或者删除的时候,从表的外键字段就设置为null
当然,前提是从表的外键字段没有非空约束

restrict: 就是拒绝主表更新或者删除

所以,常见的级联操作一共有9种,

-- on update cascade on delete cascade
-- on update cascade on delete set null
-- on update cascade on delete restrict -- on update set null on delete cascade
-- on update set null on delete set null
-- on update set null on delete restrict --on update restrict on delete cascade
--on update restrict on delete set null
--on update restrict on delete restrict

所以完整的定义外键方式语法:

 -- foreign key(从表的外键字段) references 主表名(主表的主键)
on update cascade|set null|restrict on delete cascade|set null|restrict

删除外键:
语法:

 /*
删除外键
alter table 表名 drop foreign key 外键名;
这里的外键名不是外键的字段名,而是系统在定义外键的时候自动分配的一个名字
可以通过show create table 表名\G;查看;
*/
alter table web_student drop foreign key `web_student_ibfk_1`;

-- 增加外键

/*
alter table 表名 add foreign key(从表的外键字段) reference 主表名(主表的住主键) 级联操作; alter table 表名 add foreign key(从表的外键字段) references 主表名(主表的主键)
on update cascade|set null|restrict on delete cascade|set null|restrict
*/
alter table web_student add foreign key(stu_class_id) references web_calss(class_id)
on update cascade on delete set null;

测试

 -- 先在主表上更新
update web_class set class_id = 8 where class_id = 7;
 --查询子表
select * from web_student;
 -- 先在主表上删除
delete web_class where class_id = 8;
 --查询子表
select * from web_student;

测试其他的级联操作

注意:
1.在某些大型的项目中,可能只会用到外键的设计思想,但是往往不会真正的从语法上
进行外键操作,因为外键的级联操作可能会见底mysql执行速度!而往往使用
两条sql语句去替代外键的级联操作(分别操作的sql语句)

2.外键的约束,只有在InnoDB存储引擎上存储才能执行

MySQL——外键的更多相关文章

  1. mysql 外键约束备注

    梳理mysql外键约束的知识点. 1.mysql外键约束只对InnoDb引擎有效: 2.创建外键约束如下: DROP TABLE IF EXISTS t_demo_product; CREATE TA ...

  2. MySQL外键之级联

    简介 MySQL外键起到约束作用,在数据库层面保证数据的完整性.例如使用外键的CASCADE类型,当子表(例如user_info)关联父表(例如user)时,父表更新或删除时,子表会更新或删除记录,这 ...

  3. MySQL外键约束On Delete、On Update各取值的含义

    主键.外键和索引的区别?   主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 主索引(由关键字PRIMARY定义的索引) ...

  4. Mysql 外键设置

    MySql外键设置详解 (1) 外键的使用: 外键的作用,主要有两个:    一个是让数据库自己通过外键来保证数据的完整性和一致性    一个就是能够增加ER图的可读性    有些人认为外键的建立会给 ...

  5. MySQL外键的作用和创建

    MySQL外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据.使两张表形成关联,外键只能引用外表中列的值! 我们来建两个表 CREATE TABLE `example1` ( ` ...

  6. Mysql外键的使用

    MySQL外键(请确保数据库是innodb类型)网上有很多介绍的文章,这里我就凭自己的理解再次整理了下,废话不多说,直入正题哈.外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据 ...

  7. mysql 外键和子查询,视图

    1.mysql 外键约束 建表时生成外键   foreing key ('sid') references' student'('id'); 建表后添加外键  alter table' course ...

  8. mysql外键使用和事物使用

    mysql外键功能主要是为了保证关联表数据的一致性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有 客户号,客户名称 b表中存 ...

  9. Mysql外键设置中的CASCADE、NO ACTION、RESTRICT、SET NULL

    转: Mysql外键设置中的CASCADE.NO ACTION.RESTRICT.SET NULL 2017年06月11日 10:03:13 雅静8 阅读数:5491   版权声明:本文为博主原创文章 ...

  10. mysql外键约束总结

    总结三种MySQL外键约束方式 如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是 ...

随机推荐

  1. 主从复制系列A

    一.主从原理 Replication 线程   Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql in ...

  2. 这款 IDE 插件再次升级,让「小程序云」的开发部署提速 8 倍

    今年3月份,在阿里云北京峰会上,阿里巴巴正式发布了“阿里巴巴小程序繁星计划”,截至当前,已经有成千上万的开发者加入这个计划,使得小程序得到蓬勃发展,然而不可避免的是,这些服务加重了对云端的开发部署.运 ...

  3. 大数据处理也要安全--关于MaxCompute的安全科普

    [TOC] 1.企业大数据处理现状 当今社会数据收集手段不断丰富,行业数据大量积累,数据规模已增长到了传统软件行业无法承载的海量数据(百GB.TB乃至PB)级别.基于此,阿里云推出有了一套快速.完全托 ...

  4. 使用cmd查看windows端口占用情况,并关闭应用

    在做开发的时候常常会遇到端口被占用的问题,下面是我在网上找的比较好用的一种关闭占用端口进程的方法 1.在运行中输入cmd打开dos命令窗口,比如我想找到端口8888对应的PID(通过PID找到相应的进 ...

  5. Android实战技巧之四十一:制作自己的Android SDK

      标签: sdkandroid定制sdk 2015-09-21 18:05 11237人阅读 评论(2) 收藏 举报  分类: Android(260)  版权声明:本文为博主原创文章,未经博主允许 ...

  6. 打包成exe可执行文件的方法

    Python安装扩展库与打包成exe可执行文件的方法 1.安装扩展库的几种方法. 首先可能需要使用 pip install --upgrade pip 来升级本机的pip程序.然后在命令提示符环境(即 ...

  7. 关于 solusvm

    1.母鸡用 fdisk 划一个独立分区出来与操作系统分开(分区标志 8e, 即 lvm),专门做vps磁盘,并做一个网桥2.母鸡安装被控端.注意:安装之前先安装 epel-release 源,并upd ...

  8. Chapter 2 栈和队列

    Chapter 2 栈和队列 1-   栈 当n个元素以某顺序进栈,可在任意时刻出栈,元素排列的顺序N满足Catalan()规则: 常用操作: 1   栈的初始化和定义: 2   元素x进栈: 3   ...

  9. 你真的会用Action的模型绑定吗?

    在QQ群或者一些程序的交流平台,经常会有人问:我怎么传一个数组在Action中接收.我传的数组为什么Action的model中接收不到.或者我在ajax的data中设置了一些数组,为什么后台还是接收不 ...

  10. mysql导出数据库某些表的数据

    # 导出数据,一般从从库导出,减少主库的压力.mysqldump -hhostname -P3306 --single-transaction --master-data= database_name ...