MYSQL中外键的知识与应用小结

 更新时间:2026年06月08日 10:18:13   作者:lililililiiqwq  
本文给大家介绍MYSQL中外键的知识与应用小结,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

外键(Foreign Key)详解

基本概念

外键是关系数据库中的一个重要约束条件,它用于建立和强制两个表之间的关联关系。外键是一个表中的字段(或字段集合),它引用另一个表的主键或唯一键

主要特性

  1. 参照完整性:确保外键值必须存在于被引用表的主键中,或者为NULL
  2. 级联操作:可以定义级联更新和级联删除规则
  3. 关系建立:明确表与表之间的关联方式

如图所示:具有外键的表称为主表,与外键关联的表成为父表

语法示例

CREATE TABLE 订单 (
    订单ID INT PRIMARY KEY,
    客户ID INT,
    订单日期 DATE,
    FOREIGN KEY (客户ID) REFERENCES 客户(客户ID)
);

命名解释

1.CONSTRAINT fk_order_user

  • 意思:我要创建一个约束,名字叫 fk_order_user
  • CONSTRAINT = 约束(规则)
  • fk_order_user = 你给这个规则起的名字
    • 命名规范:fk_子表_主表
    • 这里就是:订单表 关联 用户表

作用:方便以后删除 / 修改这个外键。

2.FOREIGN KEY (user_id)

  • 意思:在当前这张表(子表 / 订单表)里,user_id 这个字段是外键
  • 外键 = 用来 “去找另一张表” 的字段

作用:告诉数据库:

我这个 user_id 不是普通字段,它要关联另一张表。

3.REFERENCES user(id)

  • 意思:这个外键 参考 / 引用 主表 user 里的 id 字段
  • REFERENCES = 参考、关联、引用

作用

订单表的 user_id 必须是用户表 id 里已经存在的值 不能随便填,不能填不存在的用户 ID

三句话总结(背会就懂)

  1. CONSTRAINT 名字:给这条关联规则起个名
  2. FOREIGN KEY (字段):子表里哪个字段要做关联
  3. REFERENCES 表 (字段):关联到主表的哪个字段

添加外键

外键(Foreign Key)是数据库表中的一个或多个字段,用于建立和加强两个表数据之间的链接。外键约束用于维护关系数据库中的引用完整性。

语法格式

在SQL中,添加外键的基本语法如下:

ALTER TABLE 子表名称
ADD CONSTRAINT 外键约束名称
FOREIGN KEY (子表字段) 
REFERENCES 父表名称(父表字段);
 

详细步骤

  • 确定关系
    • 明确哪个表是父表(被引用表),哪个是子表(引用表)
    • 确定关联字段
  • 创建外键约束
    • 使用ALTER TABLE语句修改子表
    • 指定外键约束名称(可选但推荐)
    • 指定子表中的外键字段
    • 使用REFERENCES关键字指向父表及其主键
  • 可选参数
    • ON DELETE:指定删除父表记录时的行为
    • CASCADE:级联删除子表相关记录
    • SET NULL:将子表相关记录设为NULL
    • RESTRICT/NO ACTION:阻止删除(默认)
    • ON UPDATE:指定更新父表主键时的行为

示例场景

假设我们有两个表:

  • departments(部门表):包含dept_id(主键), dept_name等字段
  • employees(员工表):包含emp_id, emp_name, dept_id等字段

要为员工表添加指向部门表的外键约束:

ALTER TABLE employees
ADD CONSTRAINT fk_emp_dept
FOREIGN KEY (dept_id) 
REFERENCES departments(dept_id)
ON DELETE CASCADE
ON UPDATE CASCADE;

注意事项

  1. 父表关联字段必须是主键或唯一键
  2. 子表和父表字段数据类型必须匹配
  3. 添加外键前确保现有数据满足约束条件
  4. 外键会影响数据库性能,需合理设计
  5. 在大型表中添加外键可能需要较长时间

应用场景

  1. 维护数据完整性:防止无效数据插入
  2. 实现表间关联查询
  3. 自动级联更新或删除相关记录
  4. 建立一对多或多对一关系

删除外键

如需删除外键约束:

ALTER TABLE 表名
DROP FOREIGN KEY 外键约束名称;

这张图讲的是 MySQL 外键(FOREIGN KEY)在 ON DELETE / ON UPDATE 时的五种约束行为,我给你逐个拆解用法、区别和适用场景。

一、核心概念

这些行为,是定义在 ** 子表(有外键的表)的外键上,用来规定:父表(被引用的表)** 的主键 / 唯一键被删除或更新时,子表该如何响应。

二、逐个解释与用法

1.NO ACTION/RESTRICT

  • 作用:当父表要删除 / 更新某条记录时,如果子表里有引用这条记录的外键,则禁止父表操作,抛出错误。
  • 区别:在 MySQL 的 InnoDB 引擎中,两者行为完全一样,都是 “限制操作”。
  • 用法示例
FOREIGN KEY (user_id) REFERENCES user(id)
ON DELETE RESTRICT
ON UPDATE NO ACTION;
  • 适用场景: 订单表引用用户表时,不允许删除有订单的用户。

2.CASCADE(级联)

  • 作用:父表删除 / 更新时,子表里对应的记录也跟着一起删除 / 更新。
  • 用法示例
FOREIGN KEY (order_id) REFERENCES order(id)
ON DELETE CASCADE
ON UPDATE CASCADE;
  • 适用场景: 订单明细表引用订单表,删除订单时,自动删除该订单的所有明细。

3.SET NULL

  • 作用:父表删除时,子表里对应的外键字段会被设置为 NULL
  • 前提:外键字段必须允许为 NULL
  • 用法示例
FOREIGN KEY (manager_id) REFERENCES employee(id)
ON DELETE SET NULL;
  • 适用场景: 部门表引用员工表(manager_id),员工离职时,部门的经理字段置空,而不是删除部门。

4.SET DEFAULT

  • 作用:父表变更时,子表的外键字段会被设置为一个预设的默认值。
  • 注意:MySQL 的 InnoDB 引擎不支持,只有部分其他数据库(如 PostgreSQL)支持。
  • 在 MySQL 中不要使用这个选项,否则会报错。

三、关键对比表

表格

行为父表删除 / 更新时子表的反应限制条件
NO ACTION / RESTRICT禁止父表操作不做任何变化-
CASCADE允许父表操作同步删除 / 更新子表对应记录-
SET NULL允许父表删除子表外键设为 NULL外键字段允许为 NULL
SET DEFAULT允许父表操作子表外键设为默认值InnoDB 不支持

四、实际使用建议

  1. 优先用 RESTRICT/NO ACTION:防止误删父表数据,是最安全的默认行为。
  2. CASCADE 慎用:会自动删除子表数据,容易造成数据丢失,只在明确需要级联删除的场景用(如订单 - 订单明细)。
  3. SET NULL 注意空值:业务逻辑要能处理外键为 NULL 的情况,避免后续查询报错。
  4. 不要用 SET DEFAULT:MySQL InnoDB 不支持,写了也没用。

常见应用场景

  1. 一对多关系:如客户与订单的关系
  2. 多对多关系:通过中间表实现
  3. 自引用关系:如员工表中的经理也是员工

注意事项

  1. 外键列和被引用列必须具有相同的数据类型
  2. 外键约束会影响数据库性能
  3. 删除或更新被引用表中的记录时需要考虑外键约束

高级用法

  1. 复合外键:由多个列组成的外键
  2. 延迟约束检查:在事务结束时才检查约束
  3. 禁用外键约束:在特定情况下临时禁用约束

外键是维护数据库完整性的重要机制,合理使用可以确保数据的一致性和有效性。

附有关外键的题目:

外键面试真题(附参考答案)

1. 什么是外键?有什么作用?

参考答案

外键(Foreign Key)用于建立表与表之间的关联关系。

主要作用:

  • 保证数据一致性
  • 防止脏数据
  • 实现表关系(一对多等)

例如:

学生表中的 class_id
引用班级表中的 id

2. 外键和主键有什么区别?

参考答案

主键外键
唯一标识记录建立表关系
不允许重复可以重复
一般不能为空可以为空
一个表通常一个主键一个表可以多个外键

3. 外键可以引用普通字段吗?

参考答案

一般不能。

外键引用的字段必须:

5. 为什么删除父表数据会失败?

参考答案

因为子表存在引用。

例如:

student.class_id = 1

这时删除:

DELETE FROM class WHERE id = 1;

数据库会阻止删除。

因为:

父表记录正在被子表引用。

6. 什么是级联删除?

参考答案

删除父表数据时,自动删除对应子表数据。

例如:

ON DELETE CASCADE

删除班级时:

7. 什么是级联更新?

参考答案

当父表主键变化时:

子表外键自动同步修改。

例如:

ON UPDATE CASCADE

8. 为什么互联网公司很多不用外键?

参考答案

主要原因:

所以:

很多公司:

9. 外键一定会提高数据库安全性吗?

参考答案

会提高数据一致性。

但:

因为插入、删除时需要检查约束。

10. 外键和索引有什么关系?

参考答案

外键用于:

索引用于:

两者作用不同。

但:

外键字段通常会建立索引。

11. 一对多关系怎么设计?

参考答案

例如:

设计:

即:

“多”的一方存外键。

12. 多对多关系怎么设计?

参考答案

需要第三张中间表。

例如:

学生选课:

设计:

student
course
student_course

中间表:

student_id
course_id

13. 下面 SQL 为什么报错?

CREATE TABLE student(
    id INT PRIMARY KEY,
    class_id INT,
    FOREIGN KEY(class_id)
    REFERENCES class(id)
);

参考答案

可能原因:

14. 什么情况下适合使用外键?

参考答案

适合:

不太适合:

15. truncate 和 delete 对外键有什么影响?

参考答案

DELETE

TRUNCATE

  • 是主键(PRIMARY KEY)
  • 或唯一键(UNIQUE)

例如:

REFERENCES class(id)

这里的 id 通常是主键。

4. 创建外键时需要满足什么条件?

参考答案

必须满足:

  • 两个字段类型一致
  • 长度一致
  • 字符集最好一致
  • 被引用字段必须是主键或唯一键
  • 存储引擎必须支持外键(如 InnoDB)
  • 班级下所有学生也会删除。
  • 性能损耗
  • 分库分表困难
  • 微服务不方便
  • 影响高并发
  • 数据库不加外键
  • 在代码层维护关系
  • 不一定提高系统性能
  • 有时反而降低写入效率
  • 维护关系
  • 提高查询速度
  • 一个班级多个学生
  • 班级表:主键 id
  • 学生表:class_id 外键
  • 一个学生选多门课
  • 一门课有多个学生
  • class 表不存在
  • class.id 不是主键/唯一键
  • 存储引擎不支持
  • 类型不一致
  • 小型项目
  • 教学项目
  • 管理系统
  • 数据一致性要求高
  • 超高并发互联网系统
  • 逐行删除
  • 会触发外键检查
  • 直接清空表
  • 有外键时通常不能直接使用

到此这篇关于MYSQL中外键的知识与应用小结的文章就介绍到这了,更多相关mysql外键应用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql全量之增量备份与恢复方式

    mysql全量之增量备份与恢复方式

    这篇文章主要介绍了mysql全量之增量备份与恢复方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • mysql数据库分区的使用

    mysql数据库分区的使用

    MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下
    2025-01-01
  • MYSQL导入导出sql文件简析

    MYSQL导入导出sql文件简析

    这篇文章主要介绍了MYSQL导入导出.sql文件的相关资料,内容包括MYSQL的命令行模式的设置、命令行进入MYSQL的方法、数据库导出数据库文件、从外部文件导入数据到数据库,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • Mysql 判断查询条件索引是否生效步骤示例演示

    Mysql 判断查询条件索引是否生效步骤示例演示

    本文给大家介绍MySQL查询条件索引是否生效的完整指南,涵盖步骤、使用说明及示例演示,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-08-08
  • mysql数据库备份命令分享(mysql压缩数据库备份)

    mysql数据库备份命令分享(mysql压缩数据库备份)

    这篇文章主要介绍了mysql数据库备份常用语句,包括数据库压缩备份、备份多个MySQL数据库、备份多个MySQL数据库、将数据库转移到新服务器等语句
    2014-01-01
  • MySQL 5.7忘记root密码后修改的详细教程

    MySQL 5.7忘记root密码后修改的详细教程

    因为长时间不操作mysql而忘记root密码的朋友估计不在少数,最近发现在MySQL 5.7版本下用之前的方法修改密码不能成功了,所以只能重新想办法解决,下面这篇文章主要给大家介绍了MySQL 5.7忘记root密码后修改的详细教程,需要的朋友可以参考。
    2017-05-05
  • MySQL限制查询和数据排序介绍

    MySQL限制查询和数据排序介绍

    这篇文章主要介绍了MySQL限制查询和数据排序介绍,通过limit可以限制返回结果的行数,而当数据查询出来以后,我们可以对数据进行排序处理。在末尾使用order by语句,下文相关详细介绍,需要的小伙伴可以参考一下
    2022-03-03
  • MySQL 替换某字段内部分内容的UPDATE语句

    MySQL 替换某字段内部分内容的UPDATE语句

    至于字段内部分内容:比如替换标题里面的产品价格,接下来为你详细介绍下UPDATE语句的写法,感兴趣的你可以参考下哈,希望可以帮助到你
    2013-03-03
  • MYSQL数据库中的现有表增加新字段(列)

    MYSQL数据库中的现有表增加新字段(列)

    MYSQL 增加新字段的sql语句,需要的朋友可以参考下。
    2010-05-05
  • 揭秘SQL优化技巧 改善数据库性能

    揭秘SQL优化技巧 改善数据库性能

    这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础,重点讲述如何优化SQL,来提高数据库的性能
    2012-01-01

最新评论