数据库中的主键(Primary Key)
主键是数据库表中用于唯一标识每一行记录的一个或多个列的组合,是关系型数据库中的重要概念。
主键的核心特性
- 唯一性:主键值必须唯一,不能重复
- 非空性:主键列不能包含NULL值
- 不可变性:主键值一旦确定,通常不应更改(虽然技术上可以)
主键的作用
- 唯一标识:确保表中每一行数据都可以被唯一识别
- 提高查询效率:数据库会自动为主键创建索引
- 建立表关系:用于与其他表建立外键关系
- 数据完整性:防止重复数据的插入
主键的类型
-
自然主键:使用业务中自然存在的唯一标识(如身份证号、学号等)
- 优点:有意义,便于理解
- 缺点:可能变更,长度可能不理想
-
代理主键:使用与业务无关的字段作为主键(如自增ID、GUID等)
- 优点:稳定、简单、长度固定
- 缺点:无业务意义
主键的实现方式
1. 单列主键
CREATE TABLE students (student_id INT PRIMARY KEY, -- 直接定义主键name VARCHAR(50)
);
2. 多列组合主键(复合主键)
CREATE TABLE course_registration (student_id INT,course_id INT,registration_date DATE,PRIMARY KEY (student_id, course_id) -- 组合主键
);
3. 自增主键(常用)
CREATE TABLE employees (emp_id INT AUTO_INCREMENT PRIMARY KEY, -- 自动递增emp_name VARCHAR(50)
);
主键与索引的关系
- 主键会自动创建唯一索引( clustered index,聚集索引)
- 一个表只能有一个主键,但可以有多个唯一索引
- 主键索引的查询效率通常是最高的
主键的最佳实践
- 尽量使用短小的主键(如INT比VARCHAR更高效)
- 优先考虑代理主键而非自然主键
- 避免使用可能变更的业务字段作为主键
- 在InnoDB中,主键还影响物理存储顺序
主键与唯一键的区别
特性 | 主键(Primary Key) | 唯一键(Unique Key) |
---|---|---|
NULL值 | 不允许 | 允许(除非明确设置为NOT NULL) |
数量 | 每表只能有一个 | 每表可以有多个 |
自动创建索引 | 总是 | 总是 |
用于外键关系 | 可以 | 可以 |
理解主键的概念对于设计高效、可靠的数据库结构至关重要。