主键(Primary Key)——数据的身份证
** 核心作用**:唯一标识表中的每一行,必须唯一且非空
举个栗子(学生表)
学号(主键) | 姓名 | 年龄 |
---|---|---|
1001 | 张三 | 18 |
1002 | 李四 | 19 |
关键点:
- 主键就像身份证号,不可重复(两个学生不能有相同学号)
- 主键可以是单个字段(如学号)或联合字段(如学号+课程号)
- 实际开发中常用自增ID或UUID作为主键
正确用法:
CREATE TABLE Students (
学号 INT PRIMARY KEY, -- 明确指定主键
姓名 VARCHAR(20),
年龄 INT
);
** 错误示范**:
用「姓名」当主键 → 可能出现重名学生,违反唯一性!
外键(Foreign Key)——表之间的介绍信
核心作用:建立表之间的关联,确保引用完整性
举个栗子(选课表引用学生表)
选课ID | 学号(外键) | 课程名 |
---|---|---|
1 | 1001 | 数据库 |
2 | 1001 | 算法 |
关键点:
- 外键像介绍信,必须指向另一个表的主键(如选课表的学号对应学生表的学号)
- 外键约束可防止无效数据(比如无法插入一个不存在的学生学号到选课表)
- 可设置级联操作(如删除学生时,自动删除他的选课记录)
正确用法:
CREATE TABLE Courses (
选课ID INT PRIMARY KEY,
学号 INT,
课程名 VARCHAR(20),
FOREIGN KEY (学号) REFERENCES Students(学号) -- 外键约束
);
** 错误示范**:
选课表的学号填写2000 → 但学生表中没有2000号学生,导致数据不一致!
超键(Super Key)——备用的身份证组合
核心作用:能唯一标识行的属性集合(可能包含冗余字段)
举个栗子
学生表中,以下组合都是超键:
- {学号}
- {学号, 姓名}
- {学号, 年龄}
关键点:
- 超键是候选键的超集(候选键是最小的超键)
- 主键是从候选键中选出的一个
- 超键可以有冗余,比如{学号,姓名}中姓名是多余的
正确理解:
- 超键像备用钥匙包,里面可能有多把钥匙
- 主键是其中最常用的一把钥匙
索引(Index)——数据的目录
** 核心作用**:加速查询,但会增加写操作开销
** 举个栗子**
没有索引的查询:
SELECT * FROM Students WHERE 姓名='张三'; -- 需要逐行扫描全表
创建索引后:
CREATE INDEX idx_name ON Students(姓名); -- 给姓名列建索引
-- 再查时像查字典一样快速定位
关键点:
- 索引像书籍目录,用空间换时间
- 常见索引类型:B树索引(默认)、哈希索引、全文索引
- 适合索引的场景:
- WHERE条件频繁使用的列(如学号、手机号)
- JOIN的关联字段
- ORDER BY/GROUP BY的列
** 错误示范**:
给性别列建索引 → 只有“男/女”两种值,区分度低,索引效果差
一句话总结关系
- 主键:数据的身份证 → 唯一且必需
- 外键:表之间的介绍信 → 保证你认识对方
- 超键:备用钥匙包 → 能开门但可能累赘
- 索引:书籍目录 → 查得快但书会变厚
实际应用小贴士
- 主键选择:
- 优先用无意义的自增数字(如ID),避免用业务字段(如手机号可能变化)
- 外键使用:
- 在应用层或数据库层均可实现,但要考虑性能影响
- 索引优化:
- 不要过度索引(一般表不超过5个索引)
- 联合索引注意字段顺序(如INDEX(a,b) 能优化 WHERE a=1 AND b=2,但无法优化 WHERE b=2)
** 举个综合栗子**
设计一个「图书馆管理系统」:
- 主键:书籍表用ISBN作为主键
- 外键:借阅记录表的ISBN字段外键关联书籍表
- 索引:给借阅记录表的「借书日期」建索引,方便按时间查询
- 超键:书籍表中{ISBN, 书名}是超键,但只需用ISBN作主键