如何设置外键约束_mysql foreign key使用

来源:这里教程网 时间:2026-02-28 20:45:27 作者:

在 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
),不是字段名。

相关推荐