三十四、外键约束

简介: 三十四、外键约束

一、参照完整性

参照完整性要求关系中不允许引用不存在的实体。在 MySQL 中设置参照完整性的方式是使用 外键约束 。所谓外键就是用于在两个表中的数据之间建立和加强链接的一列或多列的组合,可控制可在外键表中存储的数据。例如,有学生表和分数表两个表,表内容如下。


student 学生表:

image.png

score 分数表:

image.png在分数表中有 stu_no 列存储的是学生表中的学生编号,当我们把这个字段设置为分数表的外键字段后,插入一条不存在的学生的分数将会报错。例如插入一条stu_no 编号为 2021003 的学生的分数,这时 MySQL 将会报错。这是因为在学生表中不存在编号为 2021003 的学生,如果想插入成功则必须现在学生表中创建编号为 2021003 这个学生后再向分数表插入这个学生的分数。


二、外键约束

上一小节提到了外键约束,那么什么是外键约束呢?外键约束是用于保持主表(父表)和从表(子表)的数据一直。在 MySQL 中只有 InnoDB 存储引擎支持外键约束。外键约束的语法如下:

[CONSTRAINT [symbol]] FOREIGRN KEY [index_name] (col_name,...) REFERENCES tbl_name(col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]

在语法中 reference_option 指的是外键约束条件,外键约束条件包括如下五种选项:


  1. RESTRICT:拒绝对父表的删除或更新操作;
  2. CASCADE:从父表删除或更新时自动删除或更新子表中匹配的行;
  3. SET NULL:从父表删除或更新时自动设置子表对应的外键列为NULL;
  4. NO ACTION: 不采取任何动作;
  5. SET DEFAULT:使用默认约束


例子:

前述的学生表的分数表可以这样创建:

# 创建学生表
create table student(
    stu_no varchar(30) not null primary key,
    name varchar(30),
    phone varchar(30)
) engine=InnoDB
# 创建分数表,设置 stu_no 为外键
create table score(
    score_no int not null auto_increment primary key,
    stu_no varchar(30),
    gross_score int,
    foreign key(stu_no) references student(stu_no)
) engine=InnoDB
目录
相关文章
|
4月前
|
设计模式 Java 数据库
【禁用外键】为什么互联网大厂禁用外键约束?详谈外键的优缺点和使用场景
从多个层面分析数据库外键的优缺点,并给出外键的使用场景和禁止使用的场景。
243 19
|
7月前
|
存储 关系型数据库 MySQL
MySQL索引18连问,谁能顶住
MySQL索引18问概览: 1. 索引是提升查询速度的数据结构,如书的目录。 2. 索引类型包括B+tree、Hash、Full-text、R-Tree等,B+tree擅长范围查询,Hash擅长等值比较。 3. 主键索引唯一且不可为空,每表只能一个;唯一索引允许唯一值,可为空。 4. 聚簇索引数据与索引顺序一致,非聚簇索引存储指针。
359 0
MySQL索引18连问,谁能顶住
|
8月前
|
存储 SQL JSON
晓得不,中间表是这样被消灭的
晓得不,中间表是这样被消灭的
|
存储 数据库 索引
【面试官挖坑】聚集索引会隐式的自动为表添加一个主键索引那你是不是就可以不设置主键索引了?
【面试官挖坑】聚集索引会隐式的自动为表添加一个主键索引那你是不是就可以不设置主键索引了?
|
关系型数据库 MySQL 数据库
|
SQL 存储 关系型数据库
MySQL基础(约束 多表查询)
1.约束 概述 约束演示 外键约束 介绍 语法 删除/更新行为 2.多表查询 多表关系 1.一对多 2.多对多 3.一对一 3.多表查询概述 1.数据准备 2.概述 4.分类 1.内连接 2.外连接 3.自连接 1.自连接查询 2.联合查询 4.子查询 1.概述 2.标量子查询 3.列子查询 4.行子查询 5.表子查询
MySQL基础(约束 多表查询)
|
测试技术 数据库 索引
软件测试面试题:主键、外键的作用,索引的优点与不足?
软件测试面试题:主键、外键的作用,索引的优点与不足?
129 0
|
SQL 关系型数据库 Java
面试突击59:一个表中可以有多个自增列吗?
面试突击59:一个表中可以有多个自增列吗?
171 0
|
存储 SQL 算法
别再一知半解啦!索引其实就这么回事!
别再一知半解啦!索引其实就这么回事!
别再一知半解啦!索引其实就这么回事!
|
存储 搜索推荐 关系型数据库
MySQL索引及其使用场合
本文主要介绍MySQL索引及其使用场合
188 1