首页常见问题正文

MySQL自增主键为什么不是连续的?

更新时间:2023-05-30 来源:黑马程序员 浏览量:

IT培训班

  MySQL的自增主键(Auto Increment)并不一定是连续的,这是由于MySQL的实现方式以及一些特殊情况所导致的。

  下面是一个简单的代码演示,展示了MySQL自增主键可能不是连续的情况:

-- 创建一个示例表
CREATE TABLE example (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50)
);

-- 插入一些数据
INSERT INTO example (name) VALUES ('John');
INSERT INTO example (name) VALUES ('Jane');

-- 查看插入后的数据
SELECT * FROM example;

  输出结果可能如下所示:

+----+------+
| id | name |
+----+------+
| 1  | John |
| 2  | Jane |
+----+------+

  可以看到,自增主键的值分别为1和2,没有出现断层,是连续的。但在一些特殊情况下,自增主键可能不是连续的。下面是一些可能导致不连续的情况:

  1.删除记录:

  如果从表中删除了一些行,自增主键的值不会重新填补已删除的空缺,而是保持原样。例如,删除id为1的行后,下一次插入的记录的主键值将为3,而不是2。

-- 删除id为1的行
DELETE FROM example WHERE id = 1;

-- 插入一条新的记录
INSERT INTO example (name) VALUES ('Bob');

-- 查看插入后的数据
SELECT * FROM example;

  输出结果:

+----+------+
| id | name |
+----+------+
| 2  | Jane |
| 3  | Bob  |
+----+------+

  2.事务回滚:

  如果在一个事务中插入了一条记录,但事务回滚了,该记录的自增主键值也会被跳过,不会继续使用。

-- 开启事务
START TRANSACTION;

-- 插入一条记录
INSERT INTO example (name) VALUES ('Alice');

-- 回滚事务
ROLLBACK;

-- 插入一条新的记录
INSERT INTO example (name) VALUES ('Charlie');

-- 查看插入后的数据
SELECT * FROM example;

  输出结果:

+----+--------+
| id |  name  |
+----+--------+
| 2  |  Jane  |
| 4  | Charlie|
+----+--------+

  可以看到,因为事务回滚了,id为3的记录被跳过,下一次插入的记录的主键值为4。

  这些情况都导致了自增主键的间断,使其不是连续的。虽然自增主键的设计初衷是为了保证唯一性和简化数据访问,但并不保证连续性。如果需要连续的自增主键,可以考虑使用其他的方式或算法来生成主键值。

分享到:
在线咨询 我要报名
和我们在线交谈!