外键配置
外键(Foreign Key)是MySQL数据库中用于建立和维护两个表之间关系的重要约束。通过外键约束,可以确保数据的引用完整性,防止无效数据的插入和更新。
配置外键
在MySQL数据表中新建列时,可以为该列配置外键约束。
配置步骤
- 进入 云开发平台/MySQL数据库/数据库表 管理页面
- 选择目标数据表
- 点击「新建列」或编辑现有列
- 在列配置中勾选「设置为外键」

- 配置外键参数

外键配置参数
| 参数名称 | 说明 | 是否必填 | 示例 |
|---|---|---|---|
| 外键名称 | 外键约束的名称,用于标识该外键 | 是 | fk_user_department |
| 关联库表 | 外键引用的父表名称 | 是 | departments |
| 关联字段 | 父表中被引用的字段名称 | 是 | id |
| 删除规则 | 当父表记录被删除时的处理方式 | 是 | 级联 |
| 更新规则 | 当父表关联字段被更新时的处理方式 | 是 | 无动作 |
删除规则详解
当父表中的记录被删除时,外键约束会根据删除规则对子表中的相关记录进行相应处理:
| 规则名称 | 英文标识 | 行为说明 | 使用场景 |
|---|---|---|---|
| 无动作 | NO ACTION | 如果子表中存在引用记录,则拒绝删除父表记录 | 需要严格控制数据删除的场景 |
| 限制 | RESTRICT | 与 NO ACTION 相同,拒绝删除操作 | 保护重要关联数据不被误删 |
| 级联 | CASCADE | 自动删除子表中所有引用该记录的数据 | 主从关系明确,需要同步删除 |
| 设为NULL | SET NULL | 将子表中的外键字段设置为 NULL | 允许子表记录独立存在 |
| 设为默认值 | SET DEFAULT | 将子表中的外键字段设置为默认值 | 有合理默认值的业务场景 |
删除规则示例
假设有用户表(users)和订单表(orders),订单表的 user_id 字段引用用户表的 id 字段:
-- 用户表
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);
-- 订单表(带外键约束)
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
amount DECIMAL(10,2),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
不同删除规则的效果:
- CASCADE:删除用户时,该用户的所有订单也会被删除
- SET NULL:删除用户时,相关订单的
user_id设为 NULL - RESTRICT:如果用户有订单,则无法删除该用户
- NO ACTION:与 RESTRICT 相同,拒绝删除操作
- SET DEFAULT:删除用户时,相关订单的
user_id设为默认值
更新规则详解
当父表中被引用字段的值发生更新时,外键约束会根据更新规则处理子表中的相关记录:
| 规则名称 | 英文标识 | 行为说明 | 使用场景 |
|---|---|---|---|
| 无动作 | NO ACTION | 如果子表中存在引用记录,则拒绝更新父表字段 | 需要严格控制主键更新的场景 |
| 限制 | RESTRICT | 与 NO ACTION 相同,拒绝更新操作 | 保护关联关系不被破坏 |
| 级联 | CASCADE | 自动更新子表中所有引用该值的字段 | 需要保持数据同步的场景 |
| 设为NULL | SET NULL | 将子表中的外键字段设置为 NULL | 允许临时断开关联关系 |
| 设为默认值 | SET DEFAULT | 将子表中的外键字段设置为默认值 | 有合理默认值的业务场景 |
更新规则示例
继续使用上面的用户表和订单表示例:
-- 订单表(带更新规则的外键约束)
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
amount DECIMAL(10,2),
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
不同更新规则的效果:
- CASCADE:更新用户ID时,相关订单的
user_id也会同步更新 - SET NULL:更新用户ID时,相关订单的
user_id设为 NULL - RESTRICT:如果用户有订单,则无法更新该用户的ID
- NO ACTION:与 RESTRICT 相同,拒绝更新操作
- SET DEFAULT:更新用户ID时,相关订单的
user_id设为默认值
实际应用示例
示例1:用户与订单关系
-- 创建用户表
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE
);
-- 创建订单表(带外键约束)
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
total_amount DECIMAL(10,2),
-- 外键约束:级联删除,限制更新
CONSTRAINT fk_order_user
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE
ON UPDATE RESTRICT
);
示例2:分类与商品关系
-- 创建商品分类表
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
description TEXT
);
-- 创建商品表(带外键约束)
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
category_id INT,
price DECIMAL(10,2),
-- 外键约束:删除时设为NULL,更新时级联
CONSTRAINT fk_product_category
FOREIGN KEY (category_id) REFERENCES categories(id)
ON DELETE SET NULL
ON UPDATE CASCADE
);