news 2026/4/23 14:56:58

MySQL 主键详解:作用与使用方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL 主键详解:作用与使用方法

MySQL 主键详解:作用、使用方法与最佳实践(2025–2026 实用版)

主键(Primary Key)是 MySQL 中最核心、最基础的约束之一,理解它能帮助你设计出高效、可维护的表结构。

一、主键到底是什么?核心作用

主键有三个最本质的作用:

  1. 唯一性(Uniqueness)
    表中每一行数据的主键值必须唯一,不能重复,也不能为 NULL

  2. 标识性(Identification)
    主键是唯一能确定一行记录的字段(或字段组合),相当于每条数据的“身份证号”。

  3. 聚集索引(Clustered Index)
    在 InnoDB 引擎(MySQL 默认引擎)中,主键就是聚集索引的依据,表数据按照主键顺序物理存储

一句话总结:
主键 = 唯一不为空 + 决定了数据的物理存储顺序 + 是查找最快的路径

二、主键的几种常见类型对比

类型定义方式示例是否允许 NULL是否自增存储空间适用场景推荐程度(2025–2026)
自然主键(业务字段)order_idVARCHAR(32)中–大业务有天然唯一标识(如订单号、车牌号)★★☆(慎用)
代理主键(自增ID)idBIGINT AUTO_INCREMENT8字节绝大多数业务表★★★★★(强烈推荐)
UUID 主键idCHAR(36) 或 BINARY(16)36/16字节需要全局唯一、分布式系统★★★☆(特定场景)
复合主键(多列)PRIMARY KEY (user_id, role_id)多对多关系表、唯一约束场景★★☆(视情况)

当前主流结论(InnoDB):

  • 95%+ 的业务表都应该使用自增 BIGINT 主键id BIGINT UNSIGNED AUTO_INCREMENT
  • UUID 适合分布式系统,但有性能代价
  • 自然主键在大多数场景下不推荐作为主键(虽然可以作为唯一索引)

三、创建主键的几种写法

-- 方式1:建表时直接定义(最常见)CREATETABLEusers(idBIGINTUNSIGNEDAUTO_INCREMENTCOMMENT'主键ID',usernameVARCHAR(50)NOTNULL,created_atDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(id))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;-- 方式2:列级约束CREATETABLEorders(order_idBIGINTUNSIGNEDAUTO_INCREMENTPRIMARYKEY,user_idBIGINTUNSIGNEDNOTNULL,amountDECIMAL(10,2)NOTNULL);-- 方式3:复合主键CREATETABLEuser_roles(user_idBIGINTUNSIGNEDNOTNULL,role_idINTUNSIGNEDNOTNULL,PRIMARYKEY(user_id,role_id));-- 方式4:已有表添加主键(慎用)ALTERTABLEusersADDPRIMARYKEY(id);

四、自增主键最常见的写法(推荐模板)

CREATETABLEexample(idBIGINTUNSIGNEDAUTO_INCREMENTCOMMENT'主键ID',-- 业务字段user_idBIGINTUNSIGNEDNOTNULLDEFAULT0,titleVARCHAR(200)NOTNULLDEFAULT'',statusTINYINTUNSIGNEDNOTNULLDEFAULT0COMMENT'0=草稿,1=发布,2=删除',created_atDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMP,updated_atDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,-- 索引INDEXidx_user_id(user_id),PRIMARYKEY(id))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_unicode_ciCOMMENT='示例表';

推荐字段顺序
主键 → 业务常用查询字段 → 状态/时间字段 → 其他

五、主键相关的常见问题与注意事项

  1. 为什么不推荐 UUID 做主键?

    • 插入性能差(随机性导致页分裂)
    • 索引占用空间大(36字节 vs 8字节)
    • 排序效率低
    • 联合索引时前缀不友好
  2. 自增 ID 会不会用完?

    • BIGINT UNSIGNED:0 ~ 18446744073709551615(约 1840 亿亿)
    • 即使每天插入 1 亿条,也要用 5000+ 年
  3. 主键能改吗?
    能,但代价极大(会重建整个表和所有二级索引)
    生产环境几乎不要改主键。

  4. 删除主键后还能恢复吗?
    不建议直接删除主键。
    如果误删,建议加回同结构主键(但自增会从 1 开始,除非用AUTO_INCREMENT = n指定)。

  5. 外键一定需要主键吗?
    外键引用的一定是被引用表的唯一键(可以是主键,也可以是唯一索引)。

六、实际场景选择建议

场景推荐主键类型理由简述
用户表、订单表、文章表BIGINT 自增顺序插入、高效、简单
分布式系统全局唯一IDUUID v7 / Snowflake / ULID避免 ID 冲突
多对多中间表复合主键(两列)天然唯一 + 节省空间
需要业务含义的编码业务字段 + 唯一索引主键仍用自增,业务码做唯一约束
日志表、监控表BIGINT 自增 或 不设主键追求极致写入性能,可不设主键

七、总结口诀

  • 默认用BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY
  • 不建议用:VARCHAR、UUID 做主键(除非有特殊需求)
  • 必须保证:主键唯一、不为空
  • InnoDB 特性:主键 = 聚集索引,决定了数据物理顺序
  • 生产建议:主键字段放在表最前面,命名为id

你现在是在设计新表,还是在优化老表?
或者有具体的场景(比如分布式系统、日志表、多租户等),我可以给你更针对性的表结构建议。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 10:45:47

VibeVoice WebUI全解析:从界面到API调用

VibeVoice WebUI全解析:从界面到API调用 1. 开篇:认识这个实时语音合成神器 你是否曾经遇到过这样的场景:需要快速将文字转换成自然流畅的语音,但又不想等待漫长的生成过程?或者想要为你的应用添加实时语音播报功能&…

作者头像 李华
网站建设 2026/4/23 12:20:35

YOLO X Layout惊艳案例:复杂文档版面分析作品集

YOLO X Layout惊艳案例:复杂文档版面分析作品集 1. 这不是普通OCR,是让文档“活”起来的视觉理解能力 你有没有遇到过这样的场景:手头有一份扫描版PDF合同,密密麻麻全是条款,但关键信息——比如签字栏、金额框、生效…

作者头像 李华
网站建设 2026/4/23 13:35:47

AI摄影革命:FLUX.小红书极致真实V2生成器效果惊艳实测

AI摄影革命:FLUX.小红书极致真实V2生成器效果惊艳实测 你还在为找不到合适的配图而烦恼吗?还在羡慕小红书博主那些光影自然、质感高级的“随手拍”吗?今天,我要带你体验一个能彻底改变你内容创作方式的“神器”——FLUX.小红书极…

作者头像 李华
网站建设 2026/4/23 10:47:12

【Linux】Linux 系统的目录结构详解

【Linux】Linux 系统的目录结构详解 Linux 文件系统采用树状层级结构,一切皆文件(目录、设备、管道、socket 等也以文件形式存在),所有内容都从根目录 / 开始展开。这种结构遵循 Filesystem Hierarchy Standard(FHS&a…

作者头像 李华
网站建设 2026/4/23 13:57:44

一键部署浦语灵笔2.5-7B:轻松实现图片内容识别与描述

一键部署浦语灵笔2.5-7B:轻松实现图片内容识别与描述 1. 为什么你需要一个“会看图说话”的AI? 你有没有遇到过这些场景: 客服收到一张模糊的产品故障截图,却要花5分钟手动打字描述问题;教师批改作业时,…

作者头像 李华
网站建设 2026/4/23 13:44:56

四两拨千斤,当超级电脑隐身:阿里云无影个人云超算「上手记」

作者 | 周雅评测 | 至顶AI实验室过去大半年,我们一直在做端侧AI算力的评测。从英伟达DGX Spark,到各家厂商的桌面AI超算,跑模型推理、测ComfyUI工作流、试各种AIGC场景。这些产品各有亮点,但测得越多,越能看清一个事实…

作者头像 李华