【问题标题】:Autoincrement problem [duplicate]自动增量问题[重复]
【发布时间】:2025-12-13 20:45:02
【问题描述】:

可能重复:
Problem with autoincrememnted “id” column

我的数据库表看起来像这张图片。 http://prntscr.com/22z1n 最近我创建了 delete.php 页面。它工作正常,但是当我删除第 21 个用户时,下一个注册用户得到第 24 个 id 而不是 21。是否可以将新注册的用户信息放在第一个空行? (在这种情况下第 21 行)

在我的注册表中,新注册的用户可以写下现有用户的名字,注册后可以和他们成为朋友。为了这个友谊,我有另一个表,将新注册用户和现有用户的 id 关联起来。为此,我在注册期间使用 mysql_insert_id 来获取新用户的 id。但是在下一次注册过程中删除第 21 行后,mysql_insert_id 给了我 21 号。但存储在第 24 行。并将新用户放入关联表21。我想解决这个问题

【问题讨论】:

  • 请勿转载。如有必要,编辑您现有的问题。

标签: php mysql


【解决方案1】:

您在上次发布此问题时收到了答案。 MySQL 维护一个内部计数器,每次将新行插入到具有自动增量列的表中时,该计数器就会递增。删除一行时增量值不会下降。

要使事情按您希望的方式工作,您需要避免使用 MySQL 自动增量,并实施您自己的解决方案来创建和增加 ID。

【讨论】:

    【解决方案2】:

    mysql_insert_id() 是获取您的 id 的一种非常非常糟糕的方法。您始终可以设置表的 auto_increment 值,但我不建议这样做。您应该始终根据一些唯一值对您插入的最新记录进行SELECT,并按 id DESC 对其进行排序,同时将其限制为一个结果。永远不要使用mysql_insert_id()

    【讨论】:

    • 即使您只是插入了它,并且您只需要获取自动增量列以供后续查询参考,这是否很糟糕?
    • @Connor Smith:是的,如果您有并发查询同时对您的数据库进行攻击。在这种情况下,你最终会得到一些其他人的 id 标记给你。 ;)
    • 感谢您的提醒,所以在所有需要引用最后一个查询的查询中,我是否应该执行子查询来获取最近更改的表的 MAX(id)?
    • @Connor Smith:你应该做一个像SELECT id FROM table WHERE name = 'somename' ORDER BY id DESC LIMIT 0,1 这样的子查询。请注意,我在这里使用name,但是您可以使用另一个或多个其他列来获取与您刚刚插入的记录相关的最准确的记录ID。
    • 好吧,这比MAX(id) 更有意义,现在我想了想。因此,将插入到name 中的值保留为变量,然后通过引用相同的变量来获取稍后放入的 id,得到它:D
    【解决方案3】:

    没有区别 - mysql_insert_id 将返回最后插入的行的自动递增 ID。如果该行的 ID 为 24,mysql_insert_id 将返回 24。

    但是,您可以更改下一个值,自动增量将导致它。阅读它here

    【讨论】:

      【解决方案4】:

      DROP你所在的字段auto_incrementing ALTER 表到ADD 字段再次具有相同的属性

      对所有现有行重新编号,下一个 auto_increment 编号将等于行数加 1

      警告

      确实没有理由您需要这样做或should 这样做!如果您在任何地方都引用了这些 ID,我知道您从前面的问题中知道 - 这可能会破坏每个链接。

      【讨论】:

      • 这是一场灾难……请不要这样做。您将失去所有参照完整性。
      • 但是,您实际上并不需要这样做 - 间隙根本不会影响您的代码
      • @Shef 你说得对,我应该补充一点 - 但是对于他想做的事情,只需确保没有间隙,它/将/工作但确实如果在其他任何地方引用了 id不知道会发生什么。我将编辑我的帖子并发出警告