MySQL 中 AUTO_INCREMENT 的步长和起始值

FreeGuideOnline 最新 2026-07-07

什么是 AUTO_INCREMENT?

AUTO_INCREMENT 是 MySQL 中为数字列提供的一种自动生成唯一序列值的属性。每当向表中插入新行且未给该列指定值时,MySQL 会自动将上一个插入的值加上步长(increment) 后赋给新行,通常用于主键。它保证了在单个表中每一行都有一个唯一标识符,且无需应用程序手动管理序列。

核心行为:

  • 默认从 1 开始。
  • 默认每次递增 1
  • 每个表只能有一个 AUTO_INCREMENT 列,且必须建立索引(通常是主键)。

起始值:如何自定义 AUTO_INCREMENT 的起点

建表时指定起始值

CREATE TABLE 语句中,可以通过 AUTO_INCREMENT = value 表选项来设置第一行的初始值。

-- 创建一个书籍表,让主键 id 从 100 开始自增
CREATE TABLE books (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255)
) AUTO_INCREMENT = 100;

之后插入的第一条记录,其 id 将为 100,第二条为 101(若步长为 1)。

修改已有表的起始值

如果表已存在,想改变当前的自增计数值,可以使用 ALTER TABLE

-- 将下一行的自增值设置为 500
ALTER TABLE books AUTO_INCREMENT = 500;

重要细节:

  • 该操作不会改变表中已有数据,只影响下一次插入时生成的数值。
  • 若设置的值小于或等于当前表中已有的最大 AUTO_INCREMENT 值,MySQL 会自动将该值调整为 MAX(id) + 1,以保证不产生冲突。
-- 假设当前表中最大 id 为 200
ALTER TABLE books AUTO_INCREMENT = 50;   -- 实际下一行 id 会变成 201

步长:控制 AUTO_INCREMENT 的增长间隔

步长决定了每次生成新值时,在当前最大值的基础上增加多少。由两个系统变量共同控制:

  • auto_increment_increment:自增步长(每次增加多少)。
  • auto_increment_offset:自增起始偏移量(从哪个值开始增长)。

默认值均为 1

基本示例

-- 查看当前会话的步长与偏移量
SHOW VARIABLES LIKE 'auto_increment%';

若设置 auto_increment_increment = 5,则序列可能为:1, 6, 11, 16 … (取决于偏移量)。

设置步长与偏移量

全局级别(影响所有新连接)

SET GLOBAL auto_increment_increment = 3;
SET GLOBAL auto_increment_offset = 1;

重启 MySQL 后会失效,要永久生效需写入配置文件(如 my.cnf):

[mysqld]
auto_increment_increment = 3
auto_increment_offset = 1

会话级别(仅影响当前连接)

SET SESSION auto_increment_increment = 2;
SET SESSION auto_increment_offset = 2;

此后在当前会话内,所有具有 AUTO_INCREMENT 列的表插入数据时,序列将从 2 开始,按步长 2 递增:2, 4, 6, 8 …

场景:多主复制或避免冲突

这两个变量最经典的应用场景是双主复制(或多源写入)。通过为不同服务器设置不同的 auto_increment_offset,可以避免主键冲突。

示例:两台服务器互为备份且均承受写入请求。

  • 服务器 Aauto_increment_increment = 2, auto_increment_offset = 1 生成 1, 3, 5, 7 …
  • 服务器 Bauto_increment_increment = 2, auto_increment_offset = 2 生成 2, 4, 6, 8 …

这样即使两个服务器同时插入数据,最终汇总时 ID 也不会冲突。

实战演示:创建一张带自定义步长的表

假设我们要设计一个日志表,希望自增 ID 从 500 开始,且每行增加 10。

  1. 设置会话变量
SET SESSION auto_increment_increment = 10;
SET SESSION auto_increment_offset = 500;
  1. 创建表并插入数据
CREATE TABLE big_log (
    log_id BIGINT AUTO_INCREMENT PRIMARY KEY,
    message TEXT
);

INSERT INTO big_log (message) VALUES ('系统启动');
INSERT INTO big_log (message) VALUES ('用户登录');
INSERT INTO big_log (message) VALUES ('数据处理');
  1. 查看结果
SELECT log_id, message FROM big_log;

期望输出:

log_id  message
500     系统启动
510     用户登录
520     数据处理

查看当前自增状态

  • 查看即将插入的下一个值:
SELECT AUTO_INCREMENT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = '你的数据库名' AND TABLE_NAME = '表名';
  • 查看当前自增计数(表元数据):
SHOW CREATE TABLE your_table;