MySQL PRIMARY KEY 主键

在关系数据库中,主键是能够唯一标识表中的每一行的一个字段或者多个字段的组合。

MySQL 主键规则

在 MySQL 中,主键需要遵循以下规则:

  • 主键是定义在表上的。一个表不强制定义主键,但最多只能定义一个主键。
  • 主键可以包含一个列或者多个列。
  • 主键列的值必须是唯一的。如果主键包含多个列,则这些列的值组合起来必须是唯一的。
  • 主键列中不能包含 NULL 值。

如果不遵循上面的规则,则可能会引发以下的错误。

  • 如果定义了多个主键,会返回错误:ERROR 1068 (42000): Multiple primary key defined
  • 如果插入或者更新时有重复的主键值,则会返回类似的错误:ERROR 1062 (23000): Duplicate entry '1' for key 'user.PRIMARY'
  • 如果插入了 NULL 值,则会返回类似的错误:ERROR 1048 (23000): Column 'id' cannot be null

定义主键

我们可以在创建表时定义主键。如下:

CREATE TABLE user (
  id INT PRIMARY KEY,
  name VARCHAR(45)
);

这里定义了 id 列为主键。

上面这种方式适合只有一列作为主键的情况,如果主键包含多列,请使用下面的方式:

CREATE TABLE user (
  com_id INT,
  user_number INT,
  name VARCHAR(45),
  PRIMARY KEY(com_id, user_number)
);

这里定义一个主键,它包含 com_iduser_number 2 列。

添加主键

如果我们创建表的时候没有设置主键,而现在我们想添加一个主键,请使用下面的方式:

ALTER TABLE user
ADD PRIMARY KEY(id);

这里为 user 表添加了主键,该主键包括 id 列。

注意,当你向一个有数据的表中添加主键时,由于主键要求列的值是唯一的并且不能为 NULL,如果该列中有重复的值或者 NULL 值,则会返回类似如下的错误:

ERROR 1062 (23000): Duplicate entry '1' for key 'user.PRIMARY'

删除主键

如果我们想删除一个表上主键,请使用下面的方式:

ALTER TABLE user
DROP PRIMARY KEY;

这里,我们删除了 user 表上的主键。

如何产生主键值

通常在业务系统中,我们不使用业务字段作为主键,虽然它们也是唯一的。我们一般使用单独的字段作为主键,这主要是出于以下两方面的原因:

  1. 保密业务数据
  2. 方便这些业务字段的修改

为了生成唯一的主键值,我们通常采用以下方法:

  1. 将主键字段设置为 AUTO_INCREMENT

    声明为 AUTO_INCREMENT 的字段会自动生成连续的整数值。

  2. 使用 UUID() 函数。

    UUID() 函数产生一个长度为 36 个字符的字符串,并且永不重复。如下:

    SELECT UUID();
    
    +--------------------------------------+
    | UUID()                               |
    +--------------------------------------+
    | 523efe70-29ac-11ec-a78b-6dba5fac4247 |
    +--------------------------------------+
    1 row in set (0.00 sec)

    UUID() 适合用在集群环境下。这样即使一个表被分区在多个服务器上,也不会产生相同的主键的记录。

  3. 使用 UUID_SHORT() 函数。

    UUID_SHORT() 函数返回一个 64 位无符号整数并全局唯一。如下:

      SELECT UUID_SHORT();
    
    +-------------------+
    | UUID_SHORT()      |
    +-------------------+
    | 99469056502923283 |
    +-------------------+
    1 row in set (0.00 sec)

主键 vs 唯一索引

主键和唯一索引都要求值是唯一的,但它们之间存在一些不同:

  • 一个表中只能定义一个主键,但是能定义多个唯一索引。
  • 主键中的值不能为 NULL,而索引中的值可以为 NULL

结论

在本文中,我们学习了什么是主键、主键的规则以及如何在 MySQL 中使用主键。本文的要点如下:

  • 主键是定义在表上的。一个表最多只能定义一个主键。
  • 主键可以包含一个列或者多个列。
  • 主键列的值必须是唯一的。如果主键包含多个列,则这些列的值组合起来必须是唯一的。
  • 主键列中不能包含 NULL 值。