0

0

mysql数据库中主键和外键有什么作用_mysql约束说明

P粉602998670

P粉602998670

发布时间:2026-02-04 10:35:35

|

150人浏览过

|

来源于php中文网

原创

主键是表中每条记录的唯一标识,强制非空且唯一,用于精准定位数据;外键是跨表引用约束,确保子表字段值在主表中存在,维护数据一致性。

mysql数据库中主键和外键有什么作用_mysql约束说明

主键是表里每条记录的“身份证号”

主键(PRIMARY KEY)强制要求字段值非空且唯一,用来精准定位某一行数据。没有主键的表在实际业务中几乎无法可靠使用——比如你查一条订单,靠什么确认就是它?靠时间?靠金额?都可能重复。只有主键能给出确定性答案。

实操建议:
• 一张表最多一个主键,但可以是多个字段组成的复合主键(如 (order_id, item_seq));
• 推荐用自增整数(INT AUTO_INCREMENT)或 UUID(注意性能取舍);
• 别等表建完再加主键:ALTER TABLE orders ADD PRIMARY KEY (order_id); 会锁表,大表执行慢;
• 主键自动创建聚簇索引,直接影响查询和排序性能,选字段时要考虑高频查询条件。

外键是两张表之间的“关系契约”

外键(FOREIGN KEY)本身不标识本表记录,而是声明“这个字段的值,必须在另一张表的某个主键(或唯一键)里存在”。它的核心作用不是加速查询,而是守住数据一致性底线——防止出现“订单绑了个根本不存在的用户”这种逻辑错误。

常见错误现象:
• 插入子表记录时报错 Cannot add or update a child row: a foreign key constraint fails,大概率是引用的主表记录还没插入,或外键字段类型/长度不匹配(如主表 user_id INT,子表却定义为 user_id BIGINT);
• 删除主表记录失败,报错提示被外键引用——这不是 bug,是约束生效了;
• 忘记引擎:外键只在 InnoDB 中有效,MyISAM 完全忽略 FOREIGN KEY 语法,也不报错,极易埋坑。

实操建议:
• 外键字段和被引用字段必须严格一致:类型、符号性(SIGNED/UNSIGNED)、字符集、甚至是否允许 NULL
• 明确设置级联行为,比如 ON DELETE CASCADEON DELETE SET NULL,否则删除主表前得手动清理子表;
• 外键会增加 INSERT/UPDATE/DELETE 开销,高并发写入场景需权衡;
• 备份恢复时注意顺序:必须先导入主表,再导入子表,否则外键校验失败。

主键和外键不是“功能互补”,而是“角色分工”

主键解决“我在哪”,外键解决“我和谁有关”。它们常一起出现,但目的完全不同:主键确保本表数据不混乱,外键确保跨表逻辑不脱节。混淆二者容易导致设计偏差——比如把外键当主键用(结果发现可为空、可重复),或在外键列上盲目建索引(其实 InnoDB 已自动为外键字段建索引,重复建反而浪费)。

CG Faces
CG Faces

免费的 AI 人物图像素材网站

下载

关键差异点:
• 主键不可为 NULL,外键字段可以为 NULL(表示“暂未关联”);
• 一张表只能有一个主键,但可以有多个外键(如订单表同时有 user_idproduct_idaddress_id);
• 主键约束本质是 NOT NULL + UNIQUE 的组合,外键约束本质是跨表的引用检查;
• 外键依赖主键(或至少是唯一键),但主键完全不依赖外键。

真正容易被忽略的细节:约束名和禁用时机

MySQL 允许给约束起名,比如 CONSTRAINT fk_orders_user_id FOREIGN KEY (user_id) REFERENCES users(id)。名字看着可有可无,但一旦出错,错误信息里全是系统生成的随机名(如 fk_1a2b3c),排查效率骤降。更麻烦的是,有些运维操作(如在线 DDL 工具、某些备份还原流程)会因外键约束失败而中断,这时临时禁用约束不是删掉它,而是用 SET FOREIGN_KEY_CHECKS = 0; ——但必须配对开启,且仅限当前会话。

务必记住:
• 约束名最好见名知义,尤其多人协作时;
FOREIGN_KEY_CHECKS = 0 是“手术刀”,不是“创可贴”,用完立刻恢复;
• 即使业务层做了校验,数据库层的外键仍有必要——网络延迟、并发竞争、代码漏判都会绕过应用层检查;
• 不要因为“ORM 框架能管理关系”就放弃外键,那是两层防御,不是重复劳动。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

669

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

308

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

282

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

516

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

257

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

387

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

535

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

608

2023.08.14

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

37

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.1万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 821人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号