news 2026/9/24 0:42:11

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/9/21 4:04:49

时序场景下高并发写入与高压缩比助力能源与金融行业降本增效

金仓时序数据库替换实践:高并发写入与高压缩比助力能源与金融行业降本增效 在智能电网实时负荷监测系统中,某省级电力调度平台每秒需接入超12万测点数据;在头部公募基金的TA(注册登记)系统中,行情快照与交…

作者头像 李华
网站建设 2026/9/22 13:56:45

StructBERT中文情感分析:从部署到应用完整教程

StructBERT中文情感分析:从部署到应用完整教程 1. 快速上手:5分钟搭建情感分析服务 你是不是经常需要分析用户评论、客服对话或者社交媒体内容中的情感倾向?手动处理不仅效率低下,还容易出错。今天我要介绍的StructBERT中文情感…

作者头像 李华
网站建设 2026/9/22 0:23:57

LFM2.5-1.2B-Thinking案例分享:如何用AI生成营销内容

LFM2.5-1.2B-Thinking案例分享:如何用AI生成营销内容 1. 引言:当营销创意遇上轻量级AI 想象一下这个场景:你是一家初创公司的市场负责人,明天一早就要发布新产品,但社交媒体文案、产品介绍、广告语都还没着落。找外包…

作者头像 李华
网站建设 2026/9/22 8:23:12

手把手教学:用Qwen3-ForcedAligner-0.6B制作精准时间轴字幕

手把手教学:用Qwen3-ForcedAligner-0.6B制作精准时间轴字幕 1. 前言:告别手动打轴,让字幕制作快10倍 如果你做过视频剪辑或者字幕制作,一定对“打轴”这个环节印象深刻。一集45分钟的电视剧,手动给每一句台词标注开始…

作者头像 李华
网站建设 2026/9/20 17:44:04

Fish Speech 1.5在智能客服中的应用:真实案例分享

Fish Speech 1.5在智能客服中的应用:真实案例分享 1. 为什么智能客服需要更自然的语音? 你有没有接过这样的客服电话?机械、平直、语速固定,像一台设定好程序的录音机——“您好,这里是XX银行,请问有什么可…

作者头像 李华
网站建设 2026/9/23 13:36:26

书匠策AI:本科论文写作的“超能外挂”,让学术小白秒变科研达人

对于本科生而言,论文写作往往是一场“硬仗”——选题迷茫、逻辑混乱、格式抓狂、查重焦虑……这些问题像一道道高墙,让许多同学在学术道路上举步维艰。但别怕!今天,我要揭秘一款专为本科生打造的“科研神器”——书匠策AI&#xf…

作者头像 李华