如何设置外键约束_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 】
相关推荐:
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
Laravel如何实现API资源集合?(Resource Collection教程)
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
在线制作视频的网站有哪些,电脑如何制作视频短片?
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
如何快速搭建支持数据库操作的智能建站平台?
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
JS去除重复并统计数量的实现方法
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
如何解决hover在ie6中的兼容性问题
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
如何获取免费开源的自助建站系统源码?
网站制作企业,网站的banner和导航栏是指什么?
如何实现javascript表单验证_正则表达式有哪些实用技巧
Python文件异常处理策略_健壮性说明【指导】
Laravel如何使用Livewire构建动态组件?(入门代码)
高端建站三要素:定制模板、企业官网与响应式设计优化
Laravel怎么清理缓存_Laravel optimize clear命令详解
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
如何用美橙互联一键搭建多站合一网站?
微信小程序 wx.uploadFile无法上传解决办法
如何在搬瓦工VPS快速搭建网站?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
昵图网官方站入口 昵图网素材图库官网入口
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
如何快速查询网址的建站时间与历史轨迹?
如何快速使用云服务器搭建个人网站?
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
java获取注册ip实例
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
三星、SK海力士获美批准:可向中国出口芯片制造设备
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
如何在 Pandas 中基于一列条件计算另一列的分组均值
如何破解联通资金短缺导致的基站建设难题?
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
b2c电商网站制作流程,b2c水平综合的电商平台?

