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

时间:2018-11-09 05:36:02

标签: mysql auto-increment

在Mysql(8.0版)数据库中,有一个名为“ web_file”的表,该表的auto_increment列为“ num_id”。由于某些删除操作,“ num_id”不是连续的。因此,我删除了原始的“ num_id”,并添加了一个从1开始仍名为“ num_id”的新auto_increment列。但是我发现新“ 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时,其最大值应等于行数。那么,导致此异常的原因是什么?

1 个答案:

答案 0 :(得分:3)

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