Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql外键应用

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

作者: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

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

2.FOREIGN KEY (user_id)

作用:告诉数据库:

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

3.REFERENCES user(id)

作用

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

三句话总结(背会就懂)

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

添加外键

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

语法格式

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

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

详细步骤

示例场景

假设我们有两个表:

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

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

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

FOREIGN KEY (manager_id) REFERENCES employee(id)
ON DELETE SET NULL;

4.SET DEFAULT

三、关键对比表

表格

行为父表删除 / 更新时子表的反应限制条件
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

例如:

REFERENCES class(id)

这里的 id 通常是主键。

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

参考答案

必须满足:

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

您可能感兴趣的文章:
阅读全文