跳到正文

主键

Primary Key

中级通用

主键(Primary Key)是数据库表中用来唯一标识每一行的一个字段或一组字段。它解决的是“这条记录到底是哪一条”的问题:用户改了昵称,系统仍能凭用户 ID 找到同一个账户。

你可能会说:「我想让每条用户记录都有固定身份,改了昵称或邮箱也不会找错人。」

读之前建议先了解

动手看看

账户管理
users · 2 条记录
用户 ID · 主键
昵称
账户状态
1042
林晓
山间来信
正常
1043
林晓
正常
WHERE user_id = 1042 → 1 条
待插入:1042 / 周宁
打开「尝试插入重复 ID」查看结果
插入被拒绝:主键 1042 已存在昵称不同也不行;原有两条记录保持不变。
1042 用户修改昵称
按用户 ID 1042 定位
尝试插入重复 ID

先看看两个同名账户,再切换改名、按 ID 定位和重复插入。可以悬停行或用 Tab 聚焦;这些交互只帮助查看,不会改动记录。

两个用户都叫林晓,昵称没法唯一认出一个账户。这里用用户 ID 做主键,1042 和 1043 才能明确区分两条记录。

高亮行就是按 1042 找到的记录。保持定位开启再修改昵称,你会看到命中的始终是同一行。

要点

  1. 1

    每行都有且只有一个身份

    一张表选定一套主键后,每行的主键值都不能与其他行重复,也不能是空值。比如订单表用订单 ID 做主键,你按这个 ID 查询,就能确定查到的是哪笔订单。

  2. 2

    身份最好不随资料变化

    邮箱看起来能区分用户,但用户可能换邮箱。若拿它当主键,引用这位用户的其他记录也可能需要跟着改。用稳定的用户 ID 做主键,邮箱就可以作为普通资料独立修改。

  3. 3

    一个字段或多个字段都可以

    主键不一定是单独的 ID。比如课程报名表中,一位用户只能报名同一门课一次,我们可以用“用户 ID+课程 ID”共同标识一条报名记录;前提是这组值确实能唯一定位它。

容易混淆的地方

主键和唯一约束都能防止重复,但一张表只选一套主键作为行的身份;你仍可以给邮箱加唯一约束,限制重复注册。外键则用来指向另一张表的记录:订单表里的用户 ID 可以是外键,指向用户表的主键,它不是这笔订单自己的身份。

什么时候用

适合用

  • 做用户账户系统时,用用户 ID 定位账户,这样用户修改昵称或邮箱后,历史订单仍能关联到同一人。
  • 做订单后台时,用订单 ID 指定要查看、退款或更新的那一笔,避免靠金额和时间猜测。
  • 设计报名关系表时,用用户 ID 和课程 ID 组成主键,区分每一条用户与课程的报名关系。

不适合用

  • 页面只是临时展示一次计算结果,没有记录要存入数据库;直接计算并展示结果,不需要设计表和主键。
  • 少量固定配置只保存在一个配置文件里,由程序整体读取;用清楚的配置项名称即可,不必为它建表、设计主键。
  • 上传的图片直接交给对象存储管理,没有建立图片记录表;用对象存储的文件标识定位文件,而不是另设数据库主键。

练一练

你在做订阅产品:用户可以修改邮箱,但账单必须一直关联原来的账户。用户表该选什么做主键?

让 AI 帮你做

请为用户表设计一个稳定的用户 ID 作为主键,不要用邮箱做主键。邮箱允许修改,但需保持唯一;账单表通过用户 ID 关联账户。请给出表结构,并说明修改邮箱时账单关联为什么不受影响。

接下来学什么