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

发布时间 - 2026-02-01 00:00:00    点击率:
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),不是字段名。


# mysql  # cad  # ai  # 数据类型  # NULL  # int  # delete  # table  # 主键  # 都是  # 已有  # 可通过  # 时用  # 前提条件  # 的是  # 键名  # 适用于  # 几点 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何快速搭建虚拟主机网站?新手必看指南  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  北京企业网站设计制作公司,北京铁路集团官方网站?  ,交易猫的商品怎么发布到网站上去?  微信h5制作网站有哪些,免费微信H5页面制作工具?  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  深圳网站制作培训,深圳哪些招聘网站比较好?  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  怎么用AI帮你设计一套个性化的手机App图标?  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  如何获取PHP WAP自助建站系统源码?  Laravel如何实现用户注册和登录?(Auth脚手架指南)  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Laravel PHP版本要求一览_Laravel各版本环境要求对照  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  如何在腾讯云服务器上快速搭建个人网站?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  Laravel怎么为数据库表字段添加索引以优化查询  如何用AWS免费套餐快速搭建高效网站?  如何快速生成专业多端适配建站电话?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  如何在七牛云存储上搭建网站并设置自定义域名?  如何基于云服务器快速搭建网站及云盘系统?  Laravel如何使用Service Container和依赖注入?(代码示例)  详解Huffman编码算法之Java实现  制作企业网站建设方案,怎样建设一个公司网站?  Android自定义listview布局实现上拉加载下拉刷新功能  使用spring连接及操作mongodb3.0实例  Laravel如何生成API文档?(Swagger/OpenAPI教程)  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  详解CentOS6.5 安装 MySQL5.1.71的方法  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  Laravel如何生成URL和重定向?(路由助手函数)  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  免费网站制作appp,免费制作app哪个平台好?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  郑州企业网站制作公司,郑州招聘网站有哪些?