auto increment—在mysql表中重建后,auto\u increment列仍然不是连续的

8ehkhllq  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(331)

mysql(版本8.0)数据库中有一个名为“web\ U file”的表,其列“num\ u id”是自动递增的。由于某些删除操作,“num\u id”不是连续的。因此,我删除了原来的“num\u id”,并添加了一个新的自动增量列,仍然命名为“num\u id”,从1开始。但是我发现新的“num\u 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代码,但每次的结果都是一样的。在我看来,当一列连续自动递增时,它的最大值应该等于行数。那么,是什么导致了这个例外呢?

kmbjn2e3

kmbjn2e31#

您看到的并不是真正的例外,而是数据库中自动递增列的行为方式。自动增量列的约定是当 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;

相关问题