外键是关系型数据库中用于建立两个表之间关联关系的约束,它通过一个表中的字段关联到另一个表的主键,保证关联数据的合法性,避免出现孤立的无效数据。在mysql中使用外键可以有效维护数据库的参照完整性,让关联表的数据保持一致。

外键的基本使用前提
在mysql中使用外键需要满足几个基础条件,否则外键创建会失败:
- 两个关联的表必须都是InnoDB存储引擎,MyISAM引擎不支持外键约束
- 作为外键关联的字段,在父表中必须是主键或者唯一索引
- 两个关联字段的数据类型必须完全一致,包括长度、有无符号等属性都要匹配
- 如果字段有字符集设置,两个关联字段的字符集也需要保持一致
创建表时添加外键
可以在创建表的语句中直接通过FOREIGN KEY关键字定义外键,基本语法如下:
-- 创建父表,存储用户基础信息
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 创建子表,存储用户订单信息,添加外键关联用户表
CREATE TABLE user_order (
order_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
order_amount DECIMAL(10,2) NOT NULL,
-- 定义外键,关联user表的id字段
FOREIGN KEY (user_id) REFERENCES user(id)
-- 设置外键删除时的行为,父表记录删除时子表关联记录也删除
ON DELETE CASCADE
-- 设置外键更新时的行为,父表记录id更新时子表关联记录同步更新
ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
修改已有表添加外键
如果表已经创建完成,也可以通过ALTER TABLE语句为表添加外键,语法格式如下:
-- 先创建两个没有外键关联的表
CREATE TABLE product (
product_id INT PRIMARY KEY AUTO_INCREMENT,
product_name VARCHAR(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE order_item (
item_id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 为order_item表添加外键,关联product表的product_id字段
ALTER TABLE order_item
ADD CONSTRAINT fk_product_id
FOREIGN KEY (product_id) REFERENCES product(product_id)
ON DELETE RESTRICT
ON UPDATE RESTRICT;
这里fk_product_id是自定义的外键名称,方便后续对外键进行管理操作。
外键的行为设置
外键的ON DELETE和ON UPDATE用来定义父表数据删除或更新时,子表关联数据的处理规则,常用的规则有以下几种:
| 规则值 | 说明 |
|---|---|
| RESTRICT | 限制操作,如果子表存在关联记录,父表不允许删除或更新对应记录 |
| CASCADE | 级联操作,父表删除或更新记录时,子表所有关联记录同步删除或更新 |
| SET NULL | 设置为空,父表删除或更新记录时,子表关联字段的值设置为NULL,要求子表字段允许为空 |
| NO ACTION | 和RESTRICT类似,在mysql中两者效果基本一致 |
查看和删除外键
如果需要查看表中已有的外键信息,可以通过SHOW CREATE TABLE语句查看表的创建语句,里面会包含外键的定义:
-- 查看user_order表的结构,包含外键信息 SHOW CREATE TABLE user_order;
如果要删除已经存在的外键,使用ALTER TABLE配合DROP FOREIGN KEY语句,需要指定外键的名称:
-- 删除order_item表上的fk_product_id外键 ALTER TABLE order_item DROP FOREIGN KEY fk_product_id;
使用外键的注意事项
- 外键会增加数据库的开销,因为每次插入、更新、删除关联数据时,mysql都需要检查外键约束,高并发场景下要谨慎使用
- 如果不需要强制的数据库层约束,也可以在应用层实现关联校验,减少数据库的性能消耗
- 外键关联的字段在父表中必须是唯一标识,否则无法创建外键约束
- 删除外键不会删除关联的索引,如果需要同时删除索引,需要额外执行删除索引的操作
mysqlforeign_key外键约束数据库设计修改时间:2026-07-02 18:57:13