主键
主键用于唯一标识表中的一行,是表内身份和跨表引用的核心锚点。
#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就误设成主键。