一架梯子,一头程序猿,仰望星空!
MYSQL基础面试题 > 内容正文

MYSQL INT类型自增ID用完了会发生什么?


问题简答

在 MySQL 中,由于所有整数类型都有最小和最大值,int作为自增 ID 列,如果单表插入的数据太大,ID用完了会发生整数溢出现象,即再次插入数据时会从该类型能表示的最小值开始重新计数,这通常称为“循环”或“回绕”(wraparound)。

问题详解:

ID用完原因

例如,如果一个 INT 类型(有符号)的自增 ID 列的最大值为 2,147,483,647,当再次插入一条记录时,该列的值将变为 -2,147,483,648,这是因为该类型的范围是 -2,147,483,648 到 2,147,483,647,超出范围的值会导致整数溢出。

解决ID用完的方案

当自增 ID 列发生循环时,可能会导致数据混乱或ID重复问题,下面是常见的解决方案:

  • 调整 ID 列的数据类型,使用能够容纳更大范围值的数据类型,如 BIGINT。
  • 使用分布式 ID 生成器,如 Snowflake 算法,以避免单点故障和循环问题。

模拟ID自增溢出的例子

1、创建一个测试表 test,其中包含一个 id 列,类型为 int,设置为自增。

CREATE TABLE test (
  id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、随便插入一条数据

INSERT INTO test (name) VALUES ("tizi365.com");

3、将 id 当前的自增值,设置为设置为 2147483647,这是 int 类型能够容纳的最大值

ALTER TABLE test AUTO_INCREMENT = 2147483647;

4、再随便插入一条数据,就会出现整数溢出

INSERT INTO test (name) VALUES ("tizi365");