Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql主键和唯一键

mysql主键和唯一键的使用与区别

作者:import_random

本文主要介绍了mysql主键和唯一键的使用与区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1. 基本概念

(1)主键 (Primary Key)

唯一标识表中每条记录,不允许重复且不能为 NULL。

主键也可以由多个列组成,这被称为‌复合主键‌(Composite Primary Key)或‌联合主键‌。

当单个列无法唯一标识表中的每一行时,就可以将多个列组合起来作为主键。

组合后的列值整体必须是唯一的,且每个参与的列都不能为NULL。

复合主键的核心特性

(2)唯一键 (Unique Key)

确保某列或列组合的值唯一,但允许 NULL 值。

2. 如何表示

(1)创建表时定义:

-- 创建包含主键和唯一键的表
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,           -- 主键
    email VARCHAR(100) UNIQUE,                   -- 唯一键(简写)
    username VARCHAR(50) UNIQUE,                 -- 另一个唯一键
    phone VARCHAR(20),
    CONSTRAINT uk_phone UNIQUE (phone)           -- 唯一键(完整写法)
);

-- 或者复合键定义方式
CREATE TABLE orders (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY (order_id, product_id),          -- 复合主键
    UNIQUE KEY uk_order_product (order_id, product_id) -- 复合唯一键
);

(2)修改表时添加:

-- 添加主键
ALTER TABLE users ADD PRIMARY KEY (id);

-- 添加唯一键
ALTER TABLE users ADD UNIQUE KEY uk_email (email);
ALTER TABLE users ADD CONSTRAINT uk_username UNIQUE (username);

3. 主要区别对比

特性主键 (Primary Key)唯一键 (Unique Key)
数量限制每表只能有一个每表可以有多个
NULL 值不允许 NULL允许 NULL(但只能有一个 NULL,某些数据库允许多个)
索引类型默认创建聚簇索引(InnoDB)创建非聚簇索引
用途标识记录的唯一性确保数据的唯一性约束
外键引用可以被其他表的外键引用很少被外键引用
自动增长常与 AUTO_INCREMENT 一起使用不能使用 AUTO_INCREMENT

4. 详细示例

-- 创建示例表
CREATE TABLE employees (
    emp_id INT AUTO_INCREMENT PRIMARY KEY,       -- 主键,自增长
    emp_code VARCHAR(10) UNIQUE,                -- 员工编号,唯一但不作为主键
    email VARCHAR(100) UNIQUE,                  -- 邮箱,唯一
    department VARCHAR(50),
    hire_date DATE
);

-- 插入数据
INSERT INTO employees (emp_code, email, department) VALUES
('E001', 'john@company.com', 'IT'),
('E002', 'jane@company.com', 'HR');

-- 以下操作会失败(违反唯一约束)
INSERT INTO employees (emp_code, email) VALUES 
('E001', 'tom@company.com');  -- emp_code 重复

-- 以下操作会失败(违反主键约束)
INSERT INTO employees (emp_id, emp_code, email) VALUES 
(1, 'E003', 'sam@company.com');  -- emp_id 重复

-- 允许 NULL 值的唯一键示例
CREATE TABLE contacts (
    id INT PRIMARY KEY,
    phone VARCHAR(20) UNIQUE,
    email VARCHAR(100) UNIQUE
);

-- 可以插入多个 NULL 到 phone 列(MySQL 特性)
INSERT INTO contacts VALUES (1, NULL, 'a@test.com');
INSERT INTO contacts VALUES (2, NULL, 'b@test.com');  -- 允许,因为 NULL != NULL

5. 复合键示例

-- 课程注册表:一个学生不能重复注册同一门课
CREATE TABLE course_registrations (
    student_id INT,
    course_id INT,
    registration_date DATE,
    PRIMARY KEY (student_id, course_id),           -- 复合主键
    UNIQUE KEY uk_student_course (student_id, course_id)  -- 复合唯一键
);

-- 有效数据
INSERT INTO course_registrations VALUES 
(1, 101, '2024-01-10'),
(1, 102, '2024-01-10'),  -- 同一个学生不同课程
(2, 101, '2024-01-11');  -- 不同学生同一课程

-- 以下会失败(违反主键/唯一键约束)
INSERT INTO course_registrations VALUES 
(1, 101, '2024-01-12');  -- student_id=1 和 course_id=101 已存在

6. 实际应用场景

主键使用场景:

唯一键使用场景:

7. 性能考虑

-- 查看表的索引信息(包括主键和唯一键)
SHOW INDEX FROM users;

-- 执行计划分析
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';

8. 总结

根据你的业务需求选择合适的方式:需要严格标识每条记录用主键,只需要防止数据重复用唯一键。

到此这篇关于mysql主键和唯一键的使用与区别的文章就介绍到这了,更多相关mysql主键和唯一键内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文