MySQL支持外键(foreign key),外键允许跨表交叉引用相关数据,另外外键约束能够保证相关数据的一致性。一个外键关系通常包括一个父表和一个子表。父表包含原始的字段数据,子表引用父表中该字段的数据,外键约束定义在子表上。

1. 外键定义的语法

通常在create table和alter table语句中定义外键约束,基本语法如下:

[CONSTRAINT [symbol]] FOREIGN KEY

[index_name] (col_name, ...)

REFERENCES tbl_name (col_name,...)

[ON DELETE reference_option]

[ON UPDATE reference_option]

reference_option:

RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

CONSTRAINT symbol 为外键约束名称,如果没有定义,InnoDB表会自动生成一个名称,这个名称在数据库里面必须唯一。

ON DELETE、ON UPDATE表示事件触发时的动作,可设置值为:

CASCADE,更新或者删除父表记录时,子表中的相应记录同步更新或者删除。由级联更新或者删除导致的子表记录修改,不会触发子表的触发器执行。

SET NULL,更新或者删除父表记录时,子表中的相应记录字段设置为NULL,前提是子表中相应字段不能定义为NOT NULL。

RESTRICT,有外键关系约束时,拒绝父表记录的更新和删除操作。

NO ACTION,无动作,实际功能与RESTRICT相同。

SET DEFAULT,仅仅解析器能识别,实际功能未实现。

2. 级联更新和级联删除

当父表对外键关联的字段进行update、delete操作时,子表对应的字段值也会同步变化,称之为级联更新或者级联删除。当外键定义时,设置 referential action 为CASCADE即可实现级联更新与删除。

示例:

foreign key(parent_id) references parent(id) on update cascade

foreign key(parent_id) references parent(id) on delete cascade

foreign key(parent_id) references parent(id) on update cascade on delete cascade

3. 外键约束案例

3.1 外键约束字段值

# 创建父表

create table parent(id int, primary key(id));

# 创建子表

create table child(id int, parent_id int,

foreign key(parent_id) references parent(id),

primary key(id));

子表child会自动在parent_id字段上加上索引。往子表插入数据或者更新数据时,parent_id字段值必须为父表parent中已经存在的值,否则会报错。如下:

Cannot add or update a child row: a foreign key

constraint fails (`db`.`child`, CONSTRAINT `child_ibfk_1`

FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`))

删除父表中有外键约束的记录时,也会报错,如下:

Cannot delete or update a parent row: a foreign key

constraint fails (`db`.`child`, CONSTRAINT `child_ibfk_1`

FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`))

3.2 外键级联更新

# 创建父表

create table parent(id int, primary key(id));

# 创建子表

create table child(id int, parent_id int,

foreign key(parent_id) references parent(id)

on update cascade,

primary key(id));

更新父表parent的id字段值,那么子表字段parent_id中相应的值也会同步更新。

3.3 外键级联删除

# 创建父表

create table parent(id int, primary key(id));

# 创建子表

create table child(id int, parent_id int,

foreign key(parent_id) references parent(id)

on delete cascade,

primary key(id));

删除父表parent的某个id字段值的记录,那么子表字段parent_id中相应值的记录也会同步删除。

3.4 删除外键

alter table child drop foreign key child_ibfk_1;

3.5 创建外键

alter table child add foreign key(parent_id) references parent(id);

4. 外键约束的条件和限制

父表和子表必须为同一种存储引擎,且不能定义为临时表。

创建外键约束需要有REFERENCES权限。

外键约束中使用的字段必须有相似的数据类型,整型的大小必须相同,有无符号也必须相同。字符串类型的长度可以不相同,但是字符集和校验规则必须相同。

外键约束的两个字段可以在同一个表中,但是不能是同一个字段。

外键约束的字段上必须要有索引,以便加快外键检查,如果引用表上的外键字段没有索引的话,MySQL会自动创建一个索引。

不支持外键字段上的前缀索引,blob和text字段不能用于外键。

InnoDB表外键约束不支持分区。

一个有外键约束的表不能修改其存储引擎。

外键约束不能引用虚拟字段。

5. 禁用外键检查

MySQL通过变量 foreign_key_checks 来开启或者禁用外键检查,这个变量作用范围可以是全局,也可以是会话级别。有些场景,禁用外键检查是非常有用的,比如:

删除一个有外键约束引用的表。

以不同的顺序重新加载表,比如使用mysqldump导出的表,顺序与外键约束的依赖顺序不一致时,先禁用外键检查,等待表导入完成后,再打开外键检查。

执行load data操作时,关闭外键检查,提高性能。

在一个有外键约束的表上执行alter table改表。

删除一个外键约束依赖的索引。

创建一个外键约束,引用的表字段暂时还不存在。

参考资料:

mysql级联删除外键约束_MySQL外键约束、级联更新、级联删除相关推荐

  1. mysql级联删除外键约束_MySQL外键设置 级联删除

    . cascade方式 在父表上update/delete记录时,同步update/delete掉子表的匹配记录 . set null方式 在父表上update/delete记录时,将子表上匹配记录的 ...

  2. mysql级联删除外键约束_MySQL外键约束,级联删除

    如果您的级联删除一个产品,因为它是一个类别的成员被杀死,那么你设置你的外键不当.给定示例表,您应该设置了以下表:CREATE TABLE categories ( id int unsigned no ...

  3. mysql中的外键约束_MySQL外键约束

    在本教程中,您将了解MySQL外键(foreign key)以及如何在MySQL中创建,添加和删除外键约束. MySQL外键简介 外键表示一个表中的一个字段被另一个表中的一个字段引用.外键对相关表中的 ...

  4. mysql 外键约束_MySQL之外键约束(FOREIGN KEY)

    定义: MySQL外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列.一个表可以有一个或多个外键. 外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每 ...

  5. mysql外键教程_MySQL外键使用详解

    最近有开始做一个实验室管理系统,因为分了几个表进行存储·所以要维护表间的关联··研究了一下MySQL的外键 . (1)只有InnoDB类型的表才可以使用外键,mysql默认是MyISAM,这种类型不支 ...

  6. mysql外键查询_MySQL外键使用详解

    最近有开始做一个实验室管理系统,因为分了几个表进行存储·所以要维护表间的关联··研究了一下MySQL的外键. (1)只有InnoDB类型的表才可以使用外键,mysql默认是MyISAM,这种类型不支持 ...

  7. mysql 主外键 策略_mysql外键策略

    1.外键 建表时添加外键:constraint 外键名 foreign key 从表字段 references 主表字段 级联操作 create table dage( create table xi ...

  8. ef mysql 外键 一对一_MySQL 外键 一对一 一对多 多对多 复制

    #外键 ## 1,学习外键首先要明白表与表之间的关系 ​ 首先要换位思考 在考虑了这边 还要考虑另一边 ​ 然后在下定论### 判断表关系的语法 #### 图书与出版社 ​ 一本书可不可以有多个出版社 ...

  9. mysql 外键查询_mysql 外键查询(mysql数据库多表联查)

    mysql 外键查询(mysql数据库多表联查) 2020-07-24 11:51:00 共10个回答 查看方式主要是通过第三方工具或者是sql语句,主要有以下三种方式1:使用Navicateform ...

最新文章

  1. 数据分析工具Pandas(6):Pandas统计计算和描述
  2. 硬链接、软链接的区别
  3. General-purpose and introductory examples for the scikit.
  4. Python 3.6出现报错解决方案:No Python 3.6 installation was detected,无法卸载Python
  5. 工作114:传参控制
  6. python 基础 学习 内置函数
  7. 傻瓜式一键破解MD5加密
  8. 期货跟单软件:大数据排名展示跟随
  9. React-Native-版高仿淘宝、京东商城首页、商品分类页面,android插件化和组件化
  10. HTTP请求详细过程
  11. latex公式斜体_latex输入斜体
  12. 关于Web前端div中<p>等块状标签位置问题
  13. 二叉树前序遍历Java
  14. TPM 2.0规范系列解读——Part 1体系结构第(四)读:TPM架构
  15. 「津津乐道播客」#212. 乱炖:原地爆炸的ZOOM做错了什么?
  16. 用计算机代码选址的优点,计算机机房选址原则
  17. 极光认证(极光一键登录)JVerification的集成
  18. 个人声明 —— 转战知乎
  19. GitBook制作电子书详细教程(命令行版)
  20. CRC16按位计算简单代码

热门文章

  1. 吉首大学计算机老师向直阳,吉首大学2020年计算机程序设计竞赛校赛完美落幕...
  2. c语言大作业答辩ppt,C语言程序设计—考试管理程序答辩ppt.ppt
  3. Odin Inspector 系列教程 --- Odin Static Inspector 使用
  4. 入坑KeePass(一)安全桌面输入管理密钥后,不能输入中文
  5. Python:视频拆分成一帧一帧的图片
  6. 实现微信自动向附近的人打招呼,实现收到指定账户推送文章时自动进入微信打开链接
  7. 是不是所有行业都适合定制开发APP
  8. 【无限互联】学员作品:懒人听书
  9. 关于GPL和LGPL
  10. Win10开启照片查看器