在 MySQL table 中重建后 auto_increment 列仍然不连续

The auto_increment column is still not continuous after rebuilding in MySQL table

在 Mysql(8.0 版)数据库中有一个名为 "web_file" 的 table 和一个 auto_increment 列 "num_id"。因为一些删除操作,"num_id"不是连续的。所以我删除了原来的 "num_id",并添加了一个新的 auto_increment 列,仍然命名为 "num_id" 从 1 开始。但是我发现新的 "num_id" 的最大值不相等与行数。这是我的 sql 代码:

alter table web_file drop column num_id;
alter table web_file add column num_id int not null auto_increment unique key;
select min(num_id), max(num_id), count(num_id) from web_file;

这是结果:

1   664291  662902

我试过多次执行sql代码,但每次的结果都是一样的。在我看来,当一列连续 auto_increment 时,它的最大值应该等于行数。那么,导致此异常的错误是什么?

您所看到的并不是真正的异常,因为它只是数据库中自动递增列的行为方式。自动增量列的约定是,当添加新的 id 时,它会依次跟在前一个最大值 之后,所有 id 值都保证是独一无二的。不能保证序列是连续的。

如果您需要一个连续序列,那么您可以使用ROW_NUMBER 解析函数(MySQL 8+ 及更高版本):

SELECT *, ROW_NUMBER() OVER (ORDER BY num_id) rn
FROM web_file;

在 MySQL 的早期版本中,您可以使用相关子查询:

SELECT *,
    (SELECT COUNT(*) FROM web_file w2 WHERE t2.num_id <= t1.num_id) rn
FROM web_file t1;