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

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

在 MySQL 中设置外键约束,核心是确保子表中的某个字段(或字段组合)必须引用父表中已存在的主键或唯一键值,从而维护数据的参照完整性。外键不能随意添加,需满足存储引擎、字段类型、索引等前提条件。

外键的基本前提条件

添加外键前必须确认以下几点:

  • 父表和子表都必须使用 InnoDB 引擎(MyISAM 不支持外键);
  • 外键字段与被引用字段的数据类型、字符集、排序规则必须完全一致(例如都是 INT UNSIGNED 或都是 VARCHAR(50) CHARACTER SET utf8

    mb4
    );
  • 被引用的字段(通常是父表主键)必须有索引(主键自带索引,若引用的是非主键唯一列,需手动加 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),不是字段名。

猜你喜欢

联络方式:

400 9058 355

邮箱:8955556@qq.com

Q Q:8955556

微信二维码
在线咨询 拨打电话

电话

400 9058 355

微信二维码

微信二维码