首页 数据库

主键(PRIMARY KEY)与唯一键(UNIQUE KEY)的区别详解

2026-01-07 10:46 csdn

在日常开发中,我们经常会看到数据表里定义了 PRIMARY KEY 或者 UNIQUE KEY,这两者看起来好像都能“唯一约束”,很多新手会有疑问:它们有什么区别?什么场景该用哪个?能否共存?

本文将从 概念、语法、实际效果、实战案例、注意事项、面试问答 六个维度,系统而深入地讲解两者的区别,帮助你真正理解这两个最常用的约束关键字。

一、PRIMARY KEY 与 UNIQUE KEY 的概念

关键字中文含义唯一性允许为空(NULL)一个表中个数
PRIMARY KEY 主键 ✔️ ❌ 不允许 只能有一个
UNIQUE KEY 唯一键 ✔️ ✔️ 允许多个 NULL 可以有多个

总结一句话:

  • 主键是表的唯一标识,必须唯一且非空,一个表只能有一个主键;唯一键也能唯一约束数据,但它可以为空,且可以存在多个。
  • 主键表就是一个人的身份证号,是唯一标识一个人的;唯一键是这个的一些属性,来唯一性约束这个人。

二、表结构创建与 SQL 示例

2.1 创建带主键的表

    CREATE TABLE users (

         id INT PRIMARY KEY,

         username VARCHAR(100),

         email VARCHAR(100)

    );

说明:

  • id 是主键,不能重复也不能为空;
  • username 和 email 没有限制,可以重复、可以为 NULL。

2.2 创建带唯一键的表

    CREATE TABLE customers (

        customer_id INT,

        phone VARCHAR(20) UNIQUE,

        email VARCHAR(100) UNIQUE

    );

说明:

  • phone 和 email 是唯一键,不能重复;
  • 但这两个字段 可以为 NULL,且可以出现多个 NULL,MySQL 中 NULL != NULL。

2.3 主键 + 唯一键共存的情况

    CREATE TABLE employees (

        emp_id INT PRIMARY KEY,

        national_id VARCHAR(20) UNIQUE,

        name VARCHAR(50)

    );

说明:

  • emp_id 是主键,必须唯一非空;
  • national_id 是唯一键,也必须唯一,但允许为 NULL;
  • 表中两个字段都约束了唯一性,互不冲突。

三、插入数据实战对比

3.1 主键不允许重复或为空

INSERT INTO users (id, username, email) VALUES (1, 'Alice', 'alice@example.com');     -- ✅ 成功

INSERT INTO users (id, username, email) VALUES (1, 'Bob', 'bob@example.com');     -- ❌ 主键重复

INSERT INTO users (id, username, email) VALUES (NULL, 'Charlie', 'c@example.com');    -- ❌ 主键不能为空

3.2 唯一键允许多个 NULL,但不允许重复值

INSERT INTO customers (customer_id, phone, email) VALUES (1, '123456', 'a@a.com');     -- ✅

INSERT INTO customers (customer_id, phone, email) VALUES (2, '123456', 'b@a.com');     -- ❌ phone 重复

INSERT INTO customers (customer_id, phone, email) VALUES (3, NULL, NULL);            -- ✅

INSERT INTO customers (customer_id, phone, email) VALUES (4, NULL, NULL);     -- ✅ NULL 可以重复

四、组合键的应用(复合主键 & 复合唯一键)

4.1 创建复合主键(两个字段组合起来作为主键)

    CREATE TABLE orders (

         order_id INT,

         product_id INT,

         PRIMARY KEY (order_id, product_id)

     );

4.2 创建复合唯一键

    CREATE TABLE student_courses (

        student_id INT,

        course_id INT,

        UNIQUE (student_id, course_id)

    );

区别:

  • 主键约束组合列必须都非空且唯一;
  • 唯一键组合列可以为 NULL,但组合的非 NULL 记录必须唯一。

五、ALTER 添加主键/唯一键

-- 添加主键

ALTER TABLE users ADD PRIMARY KEY (id);

-- 添加唯一键

ALTER TABLE users ADD UNIQUE (email);

六、注意事项与坑点总结

✅ 主键只能有一个

    CREATE TABLE test (

        a INT PRIMARY KEY,

        b INT PRIMARY KEY

     );

    ❌ 报错:只能定义一个主键!

✅ 唯一键可以有多个

    CREATE TABLE test (

        a INT UNIQUE,

        b INT UNIQUE

    );

    ✅ 合法,a、b 各自不能重复

✅ 唯一键允许多个 NULL(MySQL 中 NULL != NULL)

    INSERT INTO test (a) VALUES (NULL);

    INSERT INTO test (a) VALUES (NULL);

    ✅ 不会报错,多个 NULL 被认为不同值

七、常见面试问答总结

Q1:主键和唯一键的区别?

答:

主键用于唯一标识一行数据,不能为 NULL,一个表只能有一个主键;

唯一键也约束唯一性,但可以为 NULL,且一个表可以有多个唯一键;

主键是强约束(唯一 + 非空 + 唯一标识),唯一键是弱约束(只是唯一)。

Q2:可以同时设置主键和唯一键吗?

答:

可以。一个字段作为主键,另一个或多个字段作为唯一键,不冲突。

Q3:主键和唯一键哪个更适合身份证号字段?

答:

如果身份证号一定不能为空并作为唯一身份标识,建议用主键;

如果表已经有主键,而身份证只是辅助唯一字段,可以设置为唯一键。

八、总结

对比点主键 PRIMARY KEY唯一键 UNIQUE KEY
唯一性
是否允许 NULL ❌ 不允许 ✅ 允许多个 NULL
表中个数限制 只能一个 可以多个
是否可组合字段 ✅ 支持复合主键 ✅ 支持复合唯一键
用途 唯一标识每条记录 防止字段重复但非主标识