【问题标题】:Make auto increment fill previously deleted number [duplicate]使自动增量填充以前删除的数字[重复]
【发布时间】:2012-10-09 18:25:29
【问题描述】:

可能重复:
Using unused primary keys

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

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

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

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

【问题讨论】:

  • Autoincrement 确实只顾名思义 - i++。因此,您将无法使用它来填补已删除条目留下的空白。
  • 只是不要执着于那些差距,这根本不值得:)
  • @biziclop 我今晚第二次看到这个问题。那里有奇怪的差距痴迷者。
  • 我们也不介意拼写和语法错误(尤其是由于国际性质)。请至少使用大写字母并使用段落使其更具可读性!

标签: mysql sql auto-increment


【解决方案1】:

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

编辑:

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

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

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

希望这会有所帮助。

编辑#2:

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

编辑#3:

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

【讨论】:

  • 请您在此处发布逻辑以自动递增查找丢失的列,以便我可以创建存储过程,或者我也可以在插入命令中使用它@yatrix
【解决方案2】:

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);

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 非常感谢您的回答@john woo,我将在我的表格中创建并使用该逻辑..感谢您的帮助
    • @user1736927 不,请不要那样做。 ID 只是一个不透明的数字,不应该有任何内在含义。就让这些差距留在那里吧。
    猜你喜欢
    • 2018-01-24
    • 2022-06-15
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2020-12-14
    • 2013-07-15
    相关资源
    最近更新 更多