📄 一句话概括
主键是每一行的身份证号:全表唯一、绝不为空、一张表只有一个——数据库靠它精确认出任意一行,第二章铺的「表连接」和第三章的 UPDATE/DELETE 精确打击,全靠它当路标。
📝 本节和前面几节的关系
4-10 说过主键 = NOT NULL + UNIQUE 的加强版,4-11 说过自增列最爱给主键发号——本节收拢。它还是第二章 2-3「主键/外键」概念链的正主:外键外键,借的就是别表的主键(4-13 紧接着讲)。
一、主键的三条铁律
CREATE TABLE students (
id INT PRIMARY KEY, -- ① 全表唯一 ② 不许 NULL ③ 一表一个
name VARCHAR(20)
);
- 唯一:两行不能撞号(UNIQUE 的本事)
- 非空:没有身份证的人不存在(NOT NULL 的本事,且默认自动带上)
- 唯一性:一张表只能指定一个主键(但主键可以由多列组成——复合主键)
二、主键是给「人」用的路标
所有精确定位都指着主键:
-- 改错行?主键定位,绝不误伤
UPDATE students SET score = 95 WHERE id = 3;
-- 删准人?主键定位
DELETE FROM students WHERE id = 3;
用姓名当条件删人?同名李四一删一双。只有主键能保证「就是这一行」。
三、复合主键:两列合体当身份证
CREATE TABLE scores (
student_id INT,
subject VARCHAR(20),
score DECIMAL(5,2),
PRIMARY KEY (student_id, subject) -- 组合起来唯一
);
和 4-10 的组合 UNIQUE 形似,但更严:组合起来既唯一又非空。
四、动手 Demo:主键执法三连
CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO t VALUES (1, '甲'); -- 成功
INSERT INTO t VALUES (1, '乙'); -- ① 撞号 → 报错
INSERT INTO t VALUES (NULL, '乙'); -- ② 空号 → 报错
-- ③ 精确更新:多行同名也只改 id=2
INSERT INTO t VALUES (2, '李四');
INSERT INTO t VALUES (3, '李四');
UPDATE t SET name = '李四明' WHERE id = 2; -- 只动 2 号
SELECT * FROM t; -- 1 甲 / 2 李四明 / 3 李四
五、主键怎么选
| 选择 | 评价 |
|---|---|
| 自增整数 id(4-11) | 最常用:短、快、无业务含义 |
| 身份证号等真实唯一字段 | 慎用:业务变了号就废(一人改姓名证件?) |
| 复合主键 | 中间表(成绩、选课)常见 |
原则:主键最好没有业务含义——业务字段会变,主键永不动摇。
六、30 秒实验
建表时不设主键,插入两行一模一样的记录——都成功。再想想 3-22 外连接实验里的「订单对不上客户」:没有主键约束的世界,重复行悄悄堆积,连连接都会翻倍出错。
七、常见误区
- 「主键就是排第一的列」:不是顺序概念,是唯一识别概念
- 「一张表可以有多个主键」:只能一个;多列「复合主键」是一个主键由多列组成
- 「主键只防重复」:它还保证非空,并且是一切精确 UPDATE/DELETE、表连接的路标
自测三问
1. 主键三条铁律?(唯一/非空/一表一个) 2. 为什么删人用 id 不用姓名?(姓名可重复,主键才能唯一定位) 3. 主键为什么最好没有业务含义?(业务字段会变,主键要永不动摇)- ☐ 下一节(4-13 FOREIGN KEY、外键-与其他表进行关联)
相关笔记
- AUTO_INCREMENT-自动输入连续的编号 —— 上一节:主键的最佳拍档
- FOREIGN KEY、外键-与其他表进行关联 —— 下一节:借主键搭桥
- 表连接-将各种表组合在一起 —— 主键/外键概念首次登场
- 内连接、INNER JOIN-获取与值匹配的记录 —— JOIN 拼的就是主外键
- 🗄️ 数据库基础 · 索引 —— 全课路线图