跳到主要内容

外键配置

外键(Foreign Key)是MySQL数据库中用于建立和维护两个表之间关系的重要约束。通过外键约束,可以确保数据的引用完整性,防止无效数据的插入和更新。

配置外键

在MySQL数据表中新建列时,可以为该列配置外键约束。

配置步骤

  1. 进入 云开发平台/MySQL数据库/数据库表 管理页面
  2. 选择目标数据表
  3. 点击「新建列」或编辑现有列
  4. 在列配置中勾选「设置为外键」
云开发平台-MySQL数据库-数据库表-新建列
  1. 配置外键参数
云开发平台-MySQL数据库-数据库表-配置外键

外键配置参数

参数名称说明是否必填示例
外键名称外键约束的名称,用于标识该外键fk_user_department
关联库表外键引用的父表名称departments
关联字段父表中被引用的字段名称id
删除规则当父表记录被删除时的处理方式级联
更新规则当父表关联字段被更新时的处理方式无动作

删除规则详解

当父表中的记录被删除时,外键约束会根据删除规则对子表中的相关记录进行相应处理:

规则名称英文标识行为说明使用场景
无动作NO ACTION如果子表中存在引用记录,则拒绝删除父表记录需要严格控制数据删除的场景
限制RESTRICT与 NO ACTION 相同,拒绝删除操作保护重要关联数据不被误删
级联CASCADE自动删除子表中所有引用该记录的数据主从关系明确,需要同步删除
设为NULLSET 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自动更新子表中所有引用该值的字段需要保持数据同步的场景
设为NULLSET 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
);