🗄️ 第四章 管理数据-避免非法数据的功能
📄 一句话概括

主键是每一行的身份证号:全表唯一、绝不为空、一张表只有一个——数据库靠它精确认出任意一行,第二章铺的「表连接」和第三章的 UPDATE/DELETE 精确打击,全靠它当路标。

📝 本节和前面几节的关系

4-10 说过主键 = NOT NULL + UNIQUE 的加强版,4-11 说过自增列最爱给主键发号——本节收拢。它还是第二章 2-3「主键/外键」概念链的正主:外键外键,借的就是别表的主键(4-13 紧接着讲)。

一、主键的三条铁律

CREATE TABLE students (
    id    INT PRIMARY KEY,        -- ① 全表唯一 ② 不许 NULL ③ 一表一个
    name  VARCHAR(20)
);
  1. 唯一:两行不能撞号(UNIQUE 的本事)
  2. 非空:没有身份证的人不存在(NOT NULL 的本事,且默认自动带上)
  3. 唯一性:一张表只能指定一个主键(但主键可以由多列组成——复合主键)

二、主键是给「人」用的路标

所有精确定位都指着主键:

-- 改错行?主键定位,绝不误伤
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 外连接实验里的「订单对不上客户」:没有主键约束的世界,重复行悄悄堆积,连连接都会翻倍出错。

七、常见误区

自测三问 1. 主键三条铁律?(唯一/非空/一表一个) 2. 为什么删人用 id 不用姓名?(姓名可重复,主键才能唯一定位) 3. 主键为什么最好没有业务含义?(业务字段会变,主键要永不动摇)

相关笔记