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

9次阅读

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

如何设置外键约束_mysql 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),不是字段名。

text=ZqhQzanResources