MySQL 序列

17 Mar 2025 | 4 分钟阅读

MySQL 中的序列是根据特定需求生成的整数排列(1, 2, 3,依此类推)。序列在数据库中用于生成唯一数字。许多应用程序要求表中的每一行都包含一个不同的值,例如 student_table 中的学生滚动编号、HR 中的员工编号、CRM 中的客户 ID 等。为了满足这种类型的排列,我们使用序列来提供一种生成它们的简单方法。

MySQL不提供任何内置函数来为表行或列创建序列。但是我们可以通过SQL查询来生成它。在本文中,我们将介绍如何使用 SQL 查询在 MySQL 中创建序列。

使用 AUTO_INCREMENT 创建序列

MySQL中创建序列最简单的方法是在创建表时将列定义为AUTO_INCREMENT,该列应该是主键列。

以下是使用 AUTO_INCREMENT 属性用于列时应考虑的规则:

  • 我们可以在每个表中只创建一个 AUTO_INCREMENT 列,并且该列的数据类型为整数。
  • AUTO_INCREMENT 列还必须具有 PRIMARY 或 UNIQUE KEY 索引。
  • AUTO_INCREMENT 列必须包含NOT NULL。但是,当我们设置该列的 AUTO_INCREMENT 属性时,MySQL 会自动隐式添加 NOT NULL 约束。

示例

让我们通过以下示例来理解这一点。首先,我们需要创建一个新表,并确保其中有一个具有 AUTO_INCREMENT 属性的列,并且该列也是 PRIMARY KEY。

执行以下查询以创建表

接下来,我们将向此表中插入几行,无需为每一行提供 id,因为它是被 MySQL 自动递增的。

现在执行SELECT 语句来验证记录

我们可以在下图中看到结果。

MySQL SEQUENCE

在上图中,我们将 Id 列定义为 PRIMARY KEY 和 AUTO_INCREMENT 选项,该选项自动递增此列并始终在其存储唯一值。

当我们执行INSERT 查询时,我们不为 Id 列提供值,但 MySQL 会自动为其生成序列。

MySQL 序列如何工作?

MySQL 中的 AUTO_INCREMENT 列包含以下属性:

  • AUTO_INCREMENT 列的起始值为 1。当我们省略 INSERT 语句中的值或插入NULL时,此列始终递增 1。
  • 我们可以使用LAST_INSERT_ID()函数来获取最后生成的序列号。但是,我们也可以将最后插入的 ID 用于后续语句,这些语句在会话中应该是唯一的。
  • 如果我们向表中插入新行并指定了序列列的值,MySQL 会先检查指定的值是否已存在。如果不存在,它将把序列号插入到该列中;否则,将发出错误。再次,如果我们插入的值大于下一个序列号,MySQL 将使用它作为起始序列号。现在,MySQL 将从当前序列号生成下一个排序值。需要注意的是,这会在我们的序列中创建间隙。
  • 如果我们使用UPDATE语句更新 AUTO_INCREMENT 列的现有值,如果该列仅存储唯一值,MySQL 将发出重复键错误。如果我们使用大于现有值的值更新 AUTO_INCREMENT 列,MySQL 将为下一行插入最后一个序列号的下一个值。例如,AUTO_INCREMENT 列的最后一个序列值是 3,我们要将其更新为 10,那么下一行的序列号应该是 4。
  • 如果我们想使用DELETE语句删除最后插入的行,MySQL 不一定会重新使用已删除的序列号,因为它取决于表的存储引擎。例如,如果我们使用MyISAM表并删除最后插入的 ID(即 5),MySQL 仍会为新行插入下一个序列号 6。

让我们看一些更多示例,以便更好地理解 MySQL 序列的用法。

向表中插入两条新记录。

并执行 SELECT 语句以验证输出

MySQL SEQUENCE

接下来,我们将使用以下查询删除 id 为 6 的昆虫

再次,我们将使用以下语句向表中插入新行

我们将再次执行 SELECT 语句查看输出

MySQL SEQUENCE

在上图中,我们可以看到 MySQL 不会重新使用已删除的序列号。这是因为 Insects 表的存储引擎是InnoDB。因此,insert 查询将在 Insects 表中添加新的序列号 8。

现在,我们将更新一个现有的昆虫,其Id 为 3 更新为 Id = 2:

MySQL 发出了一个错误:Duplicate entry '2' for key 'insects.PRIMARY' column。让我们修复它

请看下图。

MySQL SEQUENCE
下一个主题MySQL JSON