mysql自动增加主键id

时间:2010-10-16 23:56:36

标签: sql phpmyadmin auto-increment

如何在您刚刚添加到已添加的最后一个ID号之前,查找已使用但已删除但已删除的删除ID号

例如:

  ID      Name

  1       Orange
  5       Apple

我有自动增量,我想将Banana添加到数字2,但自动增量将其添加为ID 6

6 个答案:

答案 0 :(得分:1)

这不是自动增量的工作原理。

我几乎肯定你必须找到缺失的ID并自己分配它们。

您可能需要重新标记您的问题,以包含您使用的数据库。我假设MySql?

答案 1 :(得分:1)

我认为通常自动增量功能用于在表上创建唯一键,并且重新使用唯一键不是密钥的正常使用,因为删除记录然后插入记录不会必然意味着插入的记录与删除的记录相同。即,直观意义上的密钥实际上并不是“唯一的”,因为两行共享了该密钥,即使从技术上讲,也没有唯一的密钥约束被破坏。

请注意,使用您自己的实现,您必须担心并发问题。即两次插入一次发生,因此...

1)用户A想要插入,因此搜索最低可用ID
2)用户B想要插入以便搜索最低可用ID
3)用户A找到最低可用ID 2 4)用户B找到最低可用ID为2
5)用户A插入一行并使用ID 2
6)用户B插入一行并尝试使用ID 2并且成功(这使得密钥不再唯一)或失败,因为ID 2已被使用..

这是什么用途?

答案 2 :(得分:0)

您必须编写自己的代码来识别最低的未使用标识符,并在INSERT查询中手动分配。您的AUTO_INCREMENT列工作正常,不会重复使用已删除的标识符。

答案 3 :(得分:0)

这就是auto-inc的工作方式。

如果您正在运行MySQL,我认为它有一些内置功能可以帮助您,但我可能会错,因为我在文档中找不到它。

您也可以自己编写脚本。它在Web服务器和数据库服务器上都是一个相当强烈的脚本,所以它不应该经常运行。

Auto-inc多年来一直运作良好。这显然是做对了。除非你有特别的理由想要在你的主键中留下空白(即便如此,你应该认真地重新考虑你在使用该字段的内容),就这样吧。如果字段是int 10且未签名,那么你将有很多的摆动空间......

答案 4 :(得分:0)

ID为6的香蕉是正确的 - 这是按照预期的方式工作。所有自动增量都允许您在不知道先前ID的情况下将新行插入表中。基本上允许您插入数据而不必担心覆盖ID,您可能会很懒惰。

自动增量的工作方式是它有一个计数器,每插入一行就会增加。删除行时,计数器不会更改。

我认为您期望的是数据库会自动向下移动行以填充缺少的ID。虽然在链表数据结构中可能也是如此,但在这种情况下不是这样。

填写这些空白的唯一方法是手动执行此操作,或编写可填补空白或重新排列表格或ID的脚本。但实际上并不需要这样做,因为当你检索用于标记的行时,你可以使用有序列表或一个简单的循环来处理这个问题,而这些差距只是无关紧要。

答案 5 :(得分:0)

好的,我有一个答案。但是如果你使用它,我会走出去打败你!此子查询将找到ID中的最低孔。只需将您的表名替换为table

INSERT INTO
    table
SET
    id = (
        SELECT
            MIN(a.id + 1)
        FROM
            table a
            LEFT JOIN table b
                ON a.id + 1 = b.id
        WHERE
            b.id IS NULL
    ),
    name = 'next'