← [ BACK_TO_NOTES ]

主键

主键用于唯一标识表中的一行,是表内身份和跨表引用的核心锚点。

#concept #growing #backend #database #sql

[!info] related notes

主键

一句话定义

主键是表中一行的稳定身份约束:它要求主键值唯一且非空,并成为其他表引用该行时最常用的锚点。

核心机制

CREATE TABLE users (
  id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  email TEXT NOT NULL UNIQUE
);

这里:

id
→ 这一行是谁

email
→ 一个需要唯一的业务属性

PRIMARY KEY 逻辑上包含“唯一 + 非空”的身份语义。一张表可以有多个 UNIQUE 候选键,但通常只有一个主键角色。

自然主键与代理主键

Natural Key

直接使用有业务含义的字段作为主键,例如身份证号、用户名或邮箱。

问题在于业务字段可能修改、规则可能变化,并且会传播到所有引用它的外键。

Surrogate Key

使用无业务含义的稳定标识,例如:

BIGINT identity
UUID

现代应用很常见的组合是:

稳定 id 作为 PRIMARY KEY
+
业务字段按需要设置 UNIQUE

复合主键

主键也可以由多列组成:

PRIMARY KEY (student_id, course_id)

这在纯连接表中很自然,但如果关系本身需要独立身份、被其他表引用或 ORM 更偏好单列 ID,也常使用独立 id 主键,再用联合唯一约束保护业务组合。

主键和自动生成 ID 不是同一个概念

PRIMARY KEY
→ 身份 / 唯一性约束

GENERATED ... AS IDENTITY / UUID generator
→ ID 从哪里产生

主键可以由数据库生成,也可以由应用生成;不要把“主键”和“自增”视为同义词。

边界与易混淆点

  • 主键不等于业务上最重要的字段。
  • 主键的稳定性通常比“看起来有意义”更重要。
  • user_id 在子表中即使引用 User 主键,也只是外键;在 1:N 关系里它可以重复,因此不能因为名字里有 id 就误设成主键。
创建于 2026/5/5 更新于 2026/9/14
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本