在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时,其最大值应等于行数。那么,导致此异常的原因是什么?
答案 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;