如何处理MySQL中自动增量ID列的碎片

时间:2009-12-01 07:42:07

标签: mysql auto-increment

我有一个带有auto_increment字段的表,有时会删除行,因此auto_increment会留下空白。有没有办法避免这种情况,或者如果没有,至少,如何编写一个SQL查询:

  1. auto_increment值更改为最大值(当前值)+ 1
  2. 返回新的auto_increment值?
  3. 我知道如何编写 1 2 部分,但是我可以将它们放在同一个查询中吗?

    如果不可能:

    如何“选择”(返回)auto_increment值或auto_increment值+ 1?

5 个答案:

答案 0 :(得分:8)

重新编号会引起混淆。现有报告将引用记录99,但如果系统重新编号,它可能会将该记录重新编号为98,现在所有报告(和填充的UI)都是错误的。一旦你分配了一个唯一的ID,它就必须保持固定。

将ID字段用于除简单唯一编号之外的任何其他内容都会有问题。要求“无间隙”只是与能够删除的要求不一致。也许您可以将记录标记为已删除而不是删除它们。然后真的没有差距。假设您正在生成编号的发票:您将使用该数字取消零值取消发票而不是删除它。

答案 1 :(得分:1)

有一种方法可以在autoinc表中手动插入id。您所要做的就是找出遗失的身份。

但是,不要这样做。如果您的数据库是关系型的,则可能非常危险。删除的ID可能在别处使用。删除后,它不会出现太多问题,也许它会孤立一个记录。如果被替换,则会出现一个巨大的问题,因为存在错误的关系。

考虑一下我有一张汽车表和一张人的表

car
carid
ownerid
name

person
personid
name

并且有一些简单的数据

car
1 1 Van
2 1 Truck
3 2 Car
4 3 Ferrari
5 4 Pinto

person
1 Mike
2 Joe
3 John
4 Steve

现在我删除了John。

person
1 Mike
2 Joe
4 Steve

如果我把一个新人吉姆放到桌子上,并且他得到了一个填补空缺的身份证,那么他最终会得到身份证3

1 Mike
2 Joe
3 Jim
4 Steve

并且通过关系,将成为法拉利的所有者。

答案 2 :(得分:0)

我通常同意此页面上的明智人士(以及duplicate个问题)建议不要重复使用自动增加的ID。这是一个很好的建议,但我不认为由我们决定提出问题的权利或错误,让我们假设开发人员知道他们想做什么以及为什么。

正如Travis J所提到的,答案是,您可以通过在insert语句中包含id列并分配所需的特定值来重用自动增量ID。

以下是将扳手投入使用的要点:MySQL本身(至少5.6 InnoDB)在以下情况下重用自动增量ID:

  • 删除自动增量ID最高的任何数字行
  • 停止并启动MySQL
  • 插入新行

插入的行的ID将被计算为max(id)+1,它从已删除的ID继续。

答案 3 :(得分:0)

正如 djna 在她/他的回答中所说的那样,以这种方式改变数据库表并不是一个好习惯,如果你一直在选择正确的方案和数据类型。顺便提一下你的问题:

  

我有一个带有auto_increment字段的表,有时会删除行,因此auto_increment会留下空白。有什么方法可以避免这种情况吗?

  1. 如果您的表在其自动增量列中有太多空白,可能是因为有如此多的测试INSERT查询
  2. 如果你想通过消除差距来防止压倒性的id值
  3. 此外,id列只是一个计数器,与数据库中的任何其他列无关
  4. ,这可能是你(或任何其他寻找此类事物的人)正在寻找的东西:

    1. 删除原始id
    2. 使用
    3. 上的auto_increment重新添加

      但是,如果您只想将auto_increment重置为第一个可用值:

      ALTER TABLE `table_name` AUTO_INCREMENT=1
      

答案 4 :(得分:-1)

不确定这是否有帮助,但在sql server中你可以重新设置标识字段。似乎mySql中有一个ALTER TABLE语句来实现这一点。例如,将ID设置为59446继续。

ALTER TABLE table_name AUTO_INCREMENT = 59446; 

我认为您应该能够组合查询以获取auto_increment字段的最大值,然后根据需要使用alter table进行更新。