主键
Primary Key
中级通用主键(Primary Key)是数据库表中用来唯一标识每一行的一个字段或一组字段。它解决的是“这条记录到底是哪一条”的问题:用户改了昵称,系统仍能凭用户 ID 找到同一个账户。
你可能会说:「我想让每条用户记录都有固定身份,改了昵称或邮箱也不会找错人。」
动手看看用户改名后仍能找到账号
先看看两个同名账户,再切换改名、按 ID 定位和重复插入。可以悬停行或用 Tab 聚焦;这些交互只帮助查看,不会改动记录。
两个用户都叫林晓,昵称没法唯一认出一个账户。这里用用户 ID 做主键,1042 和 1043 才能明确区分两条记录。
高亮行就是按 1042 找到的记录。保持定位开启再修改昵称,你会看到命中的始终是同一行。
要点主键怎样帮我们认准一条记录?
- 1
每行都有且只有一个身份
一张表选定一套主键后,每行的主键值都不能与其他行重复,也不能是空值。比如订单表用订单 ID 做主键,你按这个 ID 查询,就能确定查到的是哪笔订单。
- 2
身份最好不随资料变化
邮箱看起来能区分用户,但用户可能换邮箱。若拿它当主键,引用这位用户的其他记录也可能需要跟着改。用稳定的用户 ID 做主键,邮箱就可以作为普通资料独立修改。
- 3
一个字段或多个字段都可以
主键不一定是单独的 ID。比如课程报名表中,一位用户只能报名同一门课一次,我们可以用“用户 ID+课程 ID”共同标识一条报名记录;前提是这组值确实能唯一定位它。
容易混淆的地方
主键和唯一约束都能防止重复,但一张表只选一套主键作为行的身份;你仍可以给邮箱加唯一约束,限制重复注册。外键则用来指向另一张表的记录:订单表里的用户 ID 可以是外键,指向用户表的主键,它不是这笔订单自己的身份。
什么时候用
适合用
- 做用户账户系统时,用用户 ID 定位账户,这样用户修改昵称或邮箱后,历史订单仍能关联到同一人。
- 做订单后台时,用订单 ID 指定要查看、退款或更新的那一笔,避免靠金额和时间猜测。
- 设计报名关系表时,用用户 ID 和课程 ID 组成主键,区分每一条用户与课程的报名关系。
不适合用
- 页面只是临时展示一次计算结果,没有记录要存入数据库;直接计算并展示结果,不需要设计表和主键。
- 少量固定配置只保存在一个配置文件里,由程序整体读取;用清楚的配置项名称即可,不必为它建表、设计主键。
- 上传的图片直接交给对象存储管理,没有建立图片记录表;用对象存储的文件标识定位文件,而不是另设数据库主键。
练一练选一个答案,看看解释
你在做订阅产品:用户可以修改邮箱,但账单必须一直关联原来的账户。用户表该选什么做主键?
让 AI 帮你做复制给 AI Agent 直接用
请为用户表设计一个稳定的用户 ID 作为主键,不要用邮箱做主键。邮箱允许修改,但需保持唯一;账单表通过用户 ID 关联账户。请给出表结构,并说明修改邮箱时账单关联为什么不受影响。