可能重复:
使用未使用的主键
我创建了一个带有自动增量的 id 列的表现在,当我删除了该表中 id 为 8、12、30 的行时。
现在,当我插入一条新记录时,我想将下一条记录插入 8 然后 12 等等。
有没有办法让 MySQL 自动增量来为我做这件事?
我试图将自动增量设置为某个数字,但我不想那样做。
可能重复:
使用未使用的主键
我创建了一个带有自动增量的 id 列的表现在,当我删除了该表中 id 为 8、12、30 的行时。
现在,当我插入一条新记录时,我想将下一条记录插入 8 然后 12 等等。
有没有办法让 MySQL 自动增量来为我做这件事?
我试图将自动增量设置为某个数字,但我不想那样做。
您不想使用自动递增列。如果要填补空白,请将其设置为 int 列并处理存储过程或插入中的逻辑。
由于它是一个 int 列,因此您可以按数字顺序排列它们。只需执行 aSELECT Ids FROM Table Order By Ids
即可获取所有 Id 并检查返回数据集中的间隙。
这样做可能有一种更平滑的方法,但是您可以使用游标循环结果并与INT
在整个循环中递增的变量进行比较。当你找到一个差距(不匹配)时 - 打破循环并将该INT
值用作你的INSERT
id。
我不会为您编写代码,但这些是让您朝着正确方向前进的一些步骤。它应该是您应该能够处理的非常基本的编程。
希望这可以帮助。
正如其他人所指出的,您最好的做法是留下空白。除非桌子上有一些长度上限并且 Ids 必须是 1-30(奇怪),否则不要管它。填补空白没有任何好处。
要考虑的另一件事:如果您确实出于某种原因必须保留 1-30,请不要删除您的行。添加一列以将每一行标记为活动或不活动,然后只需在需要时更新不活动的行,然后将它们标记为活动。这是非常hacky,但你的要求有点hacky,所以......
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);
当然,如果您不想在脚上或任何您喜欢的地方开枪,您必须将这些包装到交易中。
表现得很好AUTO_INCREMENT
。它不会填补您已删除数据的任何空白。您可以做的最好的方法是创建一个满足您需求的逻辑(填补空白)。