如何设置外键约束_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不响应的原因及解决方法
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
郑州企业网站制作公司,郑州招聘网站有哪些?

