外键是关系数据库中的一个重要约束条件,它用于建立和强制两个表之间的关联关系。外键是一个表中的字段(或字段集合),它引用另一个表的
主键或唯一键
。
如图所示:具有外键的表称为主表,与外键关联的表成为父表
CREATE TABLE 订单 ( 订单ID INT PRIMARY KEY, 客户ID INT, 订单日期 DATE, FOREIGN KEY (客户ID) REFERENCES 客户(客户ID));
fk_order_userCONSTRAINT = 约束(规则)fk_order_user = 你给这个规则起的名字fk_子表_主表作用:方便以后删除 / 修改这个外键。
user_id 这个字段是外键作用:告诉数据库:
我这个
user_id不是普通字段,它要关联另一张表。
user 里的 id 字段REFERENCES = 参考、关联、引用作用:
订单表的 user_id 必须是用户表 id 里已经存在的值 不能随便填,不能填不存在的用户 ID
外键(Foreign Key)是数据库表中的一个或多个字段,用于建立和加强两个表数据之间的链接。外键约束用于维护关系数据库中的引用完整性。
在SQL中,添加外键的基本语法如下:
ALTER TABLE 子表名称ADD CONSTRAINT 外键约束名称FOREIGN KEY (子表字段) REFERENCES 父表名称(父表字段);
假设我们有两个表:
departments(部门表):包含dept_id(主键), dept_name等字段employees(员工表):包含emp_id, emp_name, dept_id等字段要为员工表添加指向部门表的外键约束:
ALTER TABLE employeesADD CONSTRAINT fk_emp_deptFOREIGN KEY (dept_id) REFERENCES departments(dept_id)ON DELETE CASCADEON UPDATE CASCADE;
如需删除外键约束:
ALTER TABLE 表名DROP FOREIGN KEY 外键约束名称;

这张图讲的是 MySQL 外键(FOREIGN KEY)在 ON DELETE / ON UPDATE 时的五种约束行为,我给你逐个拆解用法、区别和适用场景。
这些行为,是定义在 ** 子表(有外键的表)的外键上,用来规定: 当父表(被引用的表)** 的主键 / 唯一键被删除或更新时,子表该如何响应。
FOREIGN KEY (user_id) REFERENCES user(id)ON DELETE RESTRICTON UPDATE NO ACTION;
FOREIGN KEY (order_id) REFERENCES order(id)ON DELETE CASCADEON UPDATE CASCADE;
NULL。NULL。FOREIGN KEY (manager_id) REFERENCES employee(id)ON DELETE SET NULL;
表格
| 行为 | 父表删除 / 更新时 | 子表的反应 | 限制条件 |
|---|---|---|---|
NO ACTION / RESTRICT | 禁止父表操作 | 不做任何变化 | - |
CASCADE | 允许父表操作 | 同步删除 / 更新子表对应记录 | - |
SET NULL | 允许父表删除 | 子表外键设为 NULL | 外键字段允许为 NULL |
SET DEFAULT | 允许父表操作 | 子表外键设为默认值 | InnoDB 不支持 |
RESTRICT/NO ACTION:防止误删父表数据,是最安全的默认行为。CASCADE 慎用:会自动删除子表数据,容易造成数据丢失,只在明确需要级联删除的场景用(如订单 - 订单明细)。SET NULL 注意空值:业务逻辑要能处理外键为 NULL 的情况,避免后续查询报错。SET DEFAULT:MySQL InnoDB 不支持,写了也没用。外键是维护数据库完整性的重要机制,合理使用可以确保数据的一致性和有效性。
附有关外键的题目:
参考答案
外键(Foreign Key)用于建立表与表之间的关联关系。
主要作用:
例如:
学生表中的 class_id
引用班级表中的 id。
参考答案
| 主键 | 外键 |
|---|---|
| 唯一标识记录 | 建立表关系 |
| 不允许重复 | 可以重复 |
| 一般不能为空 | 可以为空 |
| 一个表通常一个主键 | 一个表可以多个外键 |
参考答案
一般不能。
外键引用的字段必须:
参考答案
因为子表存在引用。
例如:
student.class_id = 1
这时删除:
DELETE FROM class WHERE id = 1;
数据库会阻止删除。
因为:
父表记录正在被子表引用。
参考答案
删除父表数据时,自动删除对应子表数据。
例如:
ON DELETE CASCADE
删除班级时:
参考答案
当父表主键变化时:
子表外键自动同步修改。
例如:
ON UPDATE CASCADE
参考答案
主要原因:
所以:
很多公司:
参考答案
会提高数据一致性。
但:
因为插入、删除时需要检查约束。
参考答案
外键用于:
索引用于:
两者作用不同。
但:
外键字段通常会建立索引。
参考答案
例如:
设计:
即:
“多”的一方存外键。
参考答案
需要第三张中间表。
例如:
学生选课:
设计:
studentcoursestudent_course
中间表:
student_idcourse_id
CREATE TABLE student( id INT PRIMARY KEY, class_id INT, FOREIGN KEY(class_id) REFERENCES class(id));
参考答案
可能原因:
参考答案
适合:
不太适合:
参考答案
DELETE
TRUNCATE
例如:
REFERENCES class(id)
这里的 id 通常是主键。
参考答案
必须满足:
idclass_id 外键