MySQL中外键约束需满足InnoDB引擎、字段类型及索引一致等前提;建表时用FOREIGN KEY声明,已有表用ALTER TABLE ADD FOREIGN KEY添加;可通过INFORMATION_SCHEMA查询并用DROP FOREIGN KEY删除。

在 MySQL 中设置外键约束,核心是确保子表中的某个字段(或字段组合)必须引用父表中已存在的主键或唯一键值,从而维护数据的参照完整性。外键不能随意添加,需满足存储引擎、字段类型、索引等前提条件。
外键的基本前提条件
添加外键前必须确认以下几点:
- 父表和子表都必须使用 InnoDB 引擎(MyISAM 不支持外键);
- 外键字段与被引用字段的数据类型、字符集、排序规则必须完全一致(例如都是
INT UNSIGNED或都是VARCHAR(50) CHARACTER SET utf8mb4); - 被引用的字段(通常是父表主键)必须有索引(主键自带索引,若引用的是非主键唯一列,需手动加 UNIQUE 索引);
- 子表中外键字段本身最好也建索引(虽非强制,但强烈建议,否则关联查询和删除操作性能极差)。
创建表时直接定义外键
推荐在建表阶段就声明外键,结构清晰且不易遗漏约束:
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
order_no VARCHAR(20),
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
说明:
-
FOREIGN KEY (user_id)指定子表字段; -
REFERENCES users(id)指向父表users的主键id; -
ON DELETE CASCADE表示删除父表某用户时,自动删除其所有订单; -
ON UPDATE CASCADE表示更新父表主键(不推荐!仅适用于业务允许且明确需要的场景)。
给已有表添加外键约束
使用 ALTER TABLE ... ADD FOREIGN KEY 语法,注意顺序和命名可选:
ALTER TABLE orders ADD CONSTRAINT fk_orders_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL;
说明:
-
CONSTRAINT fk_orders_user_id是外键名称,便于后续查错或删除; -
ON DELETE SET NULL要求user_id字段允许为 NULL(即定义时用了NULL),否则会报错; - 若添加失败,常见原因是:字段类型不匹配、父表无索引、存在脏数据(如
orders.user_id里有users中不存在的值),需先清理或修正。
查看和删除外键
查看当前表的外键信息(含名称和规则):
SELECT CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME, UPDATE_RULE, DELETE_RULE FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'orders' AND CONSTRAINT_SCHEMA = 'your_db_name';
删除外键(需先知道外键名,可通过上一步查到):
ALTER TABLE orders DROP FOREIGN KEY fk_orders_user_id;
注意:DROP FOREIGN KEY 后面跟的是约束名(CONSTRAINT_NAME),不是字段名。










