【问题标题】:The auto_increment column is still not continuous after rebuilding in MySQL table在 MySQL 表中重建后 auto_increment 列仍然不连续
【发布时间】:2018-11-09 05:36:02
【问题描述】:

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

【问题讨论】:

  • 简短的版本是除了 auto_increment 列的唯一性之外,您永远不应该期望任何东西。冲突解决、预分配、事务回滚和导致差距的各个方面。如果你能说出你为什么希望它连续,也许可以提供另一种解决方案。 btw dba.stackexchange.com 适合这些问题/答案。
  • @danblack 我想使用连续的 auto_increment 键将表划分为几个统一的部分,因为使用“限制”会导致搜索整个表,这似乎越来越慢。那么这种情况的最佳解决方案是什么?
  • 您的问题几乎没有表达出令人满意的答案。 pagination 可能是您描述的偏移退化的解决方案。如果这还不够,请显示您的查询。

标签: mysql auto-increment


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-09-20
    • 2021-03-14
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多