5

可能重复:
使用未使用的主键

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

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

有没有办法让 MySQL 自动增量来为我做这件事?

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

4

3 回答 3

7

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

编辑:

由于它是一个 int 列,因此您可以按数字顺序排列它们。只需执行 aSELECT Ids FROM Table Order By Ids即可获取所有 Id 并检查返回数据集中的间隙。

这样做可能有一种更平滑的方法,但是您可以使用游标循环结果并与INT在整个循环中递增的变量进行比较。当你找到一个差距(不匹配)时 - 打破循环并将该INT值用作你的INSERTid。

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

希望这可以帮助。

编辑#2:

正如其他人所指出的,您最好的做法是留下空白。除非桌子上有一些长度上限并且 Ids 必须是 1-30(奇怪),否则不要管它。填补空白没有任何好处。

编辑#3:

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

于 2012-10-19T07:16:31.277 回答
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);

当然,如果您不想在脚上或任何您喜欢的地方开枪,您必须将这些包装到交易中。

于 2012-10-19T07:41:03.033 回答
2

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

于 2012-10-19T07:16:32.600 回答