【问题标题】:mysql auto increment primary key id'smysql自动增加主键ID
【发布时间】:2011-04-26 11:12:03
【问题描述】:

您如何查找已使用的删除 ID 号,但在不再使用时删除后,您只需将其附加到已添加的最后一个 ID 号的顶部

例如:

  ID      Name

  1       Orange
  5       Apple

我开启了自动增量,我想将香蕉添加到数字 2,但自动增量将其添加为 ID 6

【问题讨论】:

  • 是否有特定原因需要序列中没有间隙?

标签: sql phpmyadmin auto-increment


【解决方案1】:

这就是 auto-inc 的工作原理。

如果您正在运行 MySQL,我认为它具有内置功能可以为您执行此操作,但我可能错了,因为我在文档中找不到它。

您也可以自己编写脚本。这将是 Web 服务器和数据库服务器上的一个非常密集的脚本,因此不应过于频繁地运行它。

Auto-inc 多年来一直如此。这显然是在做正确的事情。除非您有特定的理由不希望主键中出现空白(即使那样,您也应该认真重新考虑使用该字段的目的),否则就顺其自然吧。如果该字段是 int 10 且未签名,您将有 大量 回旋余地...

【讨论】:

  • 我不会。在 auto-inc 字段中使用 INT(10) UNSIGNED 将为您提供 4,294,967,295 个自动增量供您使用。一旦你开始接近这个数字,你就可以编写一个维护脚本来完成并执行任务。
【解决方案2】:

好的,我有一个答案。但如果你用它,我会出来揍你!此子查询将找到 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'

【讨论】:

    【解决方案3】:

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

    请注意,使用您自己的实现时,您必须担心并发问题。即同时发生两个插入,所以...

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

    这个的预期用途是什么?

    【讨论】:

    • 就是这样,好点,这很有意义,这只是一个学校项目
    【解决方案4】:

    ID 为 6 的 Banana 是正确的 - 这正按预期工作。所有自动增量都是允许您在不知道先前 ID 的情况下将新行插入表中。基本上可以让你插入数据而不用担心覆盖ID,而且你可以偷懒。

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

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

    您可以填补这些空白的唯一方法是手动完成,或者编写一个脚本来填补空白或重新排列表格或 ID。但实际上没有必要这样做,因为当您检索行以供标记使用时,您可以使用有序列表或普通循环来处理这个问题,而这些差距将是无关紧要的。

    【讨论】:

    • 谢谢,是的,我想我只是喜欢看到一切井井有条哈哈,好吧,我想没关系,
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

      • 你的意思是有代码可以搜索下一个可用的身份证号码吗?或手动执行(这会很糟糕,因为它是一个相当长的数据库)
      猜你喜欢
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 2012-12-08
      • 2012-12-14
      • 1970-01-01
      相关资源
      最近更新 更多