使自动增量填充先前删除的数字

时间:2012-10-19 07:13:28

标签: mysql sql auto-increment

  

可能重复:
  Using unused primary keys

我创建了一个带有自动增量的id列的表 现在,当我删除该表中id为8,12,30的行时。

现在,当我插入新记录时,我想将下一条记录插入8然后12等。

有没有办法让MySQL自动增加为我做这个?

我尝试将自动增量设置为某个数字,但我不想这样做。

3 个答案:

答案 0 :(得分:5)

然后您不想使用自动递增列。如果要填补空白,请将其设置为int列并处理存储过程或插入中的逻辑。

编辑:

由于它是一个int列,您可以用数字命令它们。只需执行SELECT Ids FROM Table Order By Ids即可获取所有ID并检查返回数据集中的间隙。

可能有一种更平滑的方法,但您可以使用游标循环结果,并与在整个循环中递增的INT变量进行比较。当您找到间隙(不匹配)时 - 中断循环并将INT值用作INSERT ID。

我不会为您编写代码,但这些步骤可以让您朝着正确的方向前进。它应该是你应该能够处理的一个非常基本的编程。

希望这有帮助。

编辑#2:

正如其他人所说,你最好的举动就是留下空白。除非在桌子上有一些上限,长度和Ids必须是1-30(奇怪),否则不管它。填补空白没有任何好处。

编辑#3:

还有一件事需要考虑:如果您因某种原因确实必须保留1-30,请不要删除您的行。添加一列将每行标记为活动,然后只在需要时更新处于非活动状态的行,然后将它们标记为活动。这非常hacky,但你的要求有点hacky,所以......

答案 1 :(得分:3)

http://sqlfiddle.com/#!8/3f071/1

@x设置为最小的未使用值:

SET @x = (
  SELECT MIN(t1.id+1)
  FROM      t t1
  LEFT JOIN t t2 ON t2.id = t1.id + 1
  WHERE t2.id IS NULL
);

INSERT INTO t(id) VALUES (@x);

@x设置为间隙中最小的未使用值,否则返回NULL以使用MySQL的自动增量机制:

SET @x = (
  SELECT IF( MIN(t1.id-1) = 0, NULL, MIN(t1.id-1) )
  FROM      t t1
  LEFT JOIN t t2 ON t2.id = t1.id - 1
  WHERE t2.id IS NULL
);

INSERT INTO t(id) VALUES (@x);

当然,如果你不想在自己的脚下或任何你喜欢的地方拍摄,你必须把它们包装成交易。

答案 2 :(得分:2)

AUTO_INCREMENT表现得那样。它不会填补您删除的数据上的任何空白。您可以做的最好的方法是创建一个满足您需求的逻辑(填补空白)。