在 MySQL 数据库中,主键(Primary Key) 是表结构设计中最重要的约束之一。它不仅是数据唯一性的保障,也是多表关联、查询优化的核心工具。本文将从 主键的作用 和 主键的用法 两个方面进行讲解,并配合代码示例帮助理解
一、主键的作用
1. 唯一标识记录
主键的主要作用是唯一标识表中的每一行数据
-
主键列的值必须 唯一(Unique)
-
主键列的值不能 为空(NOT NULL)
示例
sql
CREATE TABLE users (
id INT PRIMARY KEY, -- 主键
username VARCHAR(50),
email VARCHAR(100)
);
INSERT INTO users (id, username, email) VALUES
(1, 'Alice', 'alice@example.com'),
(2, 'Bob', 'bob@example.com');
此时 id
作为主键,不能重复,也不能为 NULL
如果你执行:
sql
INSERT INTO users (id, username, email) VALUES (1, 'Charlie', 'charlie@example.com');
会报错:
sql
Duplicate entry '1' for key 'PRIMARY'
2. 保证数据完整性
主键约束能有效防止重复数据出现,从而保证数据的一致性
示例
sql
CREATE TABLE customers (
email VARCHAR(100) PRIMARY KEY,
name VARCHAR(50)
);
此时任何两行都不能有相同的 email
,避免一个邮箱重复注册。
3. 作为外键的目标
主键是外键关联的基础。其他表的外键字段通常引用某个表的主键,从而建立 一对多 或 多对多 关系。
示例
sql
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT,
FOREIGN KEY (user_id) REFERENCES users(id)
);
这样 orders.user_id
必须是 users.id
中已存在的值,防止出现无效的订单记录
4. 提高查询性能
在 InnoDB 存储引擎中,主键会自动创建 聚簇索引(Clustered Index) ,数据存储会按主键顺序组织
查询时,如果条件中包含主键,MySQL 可以直接定位到目标行,而无需全表扫描
示例
sql
SELECT * FROM users WHERE id = 2;
会直接通过主键索引定位到目标行,速度非常快。
二、主键的使用方法
1. 创建表时定义主键
sql
CREATE TABLE products (
product_id INT PRIMARY KEY,
name VARCHAR(100),
price DECIMAL(10,2)
);
2. 创建表后添加主键
sql
ALTER TABLE products
ADD PRIMARY KEY (product_id);
3. 复合主键(多个列组成主键)
当单一字段不足以唯一标识一行数据时,可以使用 复合主键。
sql
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id)
);
此时 order_id
和 product_id
的组合必须唯一。
4. 自增主键(AUTO_INCREMENT)
让主键自动递增,避免手动输入 ID:
sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
email VARCHAR(100)
);
5. 删除主键
sql
ALTER TABLE products
DROP PRIMARY KEY;