【问题标题】:Problem with auto-incremented "id" column自动递增“id”列的问题
【发布时间】:2011-09-17 11:50:06
【问题描述】:

我的数据库表看起来像这张图片。 http://prntscr.com/22z1n

最近我创建了 delete.php 页面。它工作正常,但是当我删除第 21 个用户时,下一个注册用户得到第 24 个 id 而不是 21。

是否可以将新注册的用户信息放在第一个空行? (在这种情况下第 21 行)

在我的注册表中,新注册的用户可以写下现有用户的名字,注册后可以和他们成为朋友。对于这种友谊,我有另一个表,将新注册用户和现有用户的 id 关联起来。

为此,我在注册期间使用 mysql_insert_id 来获取新用户的 id。但是在 nex 注册过程中删除第 21 行后,mysql_insert_id 给了我 21 号。但存储在第 24 行。并将新用户放入关联表21。我想解决这个问题

【问题讨论】:

  • 您可能误解了mysql_insert_id()。它返回最后插入的 id。重复调用它总是会返回最后一个,永远不会返回下一个。直到另一个插入完成后,它的值才会改变。
  • 您好,您提供的链接不再有效。可以换吗?

标签: php mysql database auto-increment


【解决方案1】:

重置 auto_increment 值不是一个好习惯,但如果你真的需要这样做,那么你可以:

ALTER TABLE mytable AUTO_INCREMENT = 1;

每次删除后运行此查询。 Auto_increment 值不会设置为1,这将自动设置可能的最低值。

【讨论】:

  • @Tural,让我们想象一下你有 table1 和 table2。 table2 有一个指向 table1 的外键。假设您从 table1 中删除了一些内容,然后在同一个表中添加了一个新行。所以新行获得与删除行相同的 id。但是现在我们可能会遇到一种情况,即 table2 中的一行指向 table1 中的新行。之前这一行指向我们删除的行,现在它指向一个新行。如您所见,这是可以的。
  • @Tural,对不起,在我的最后一句话中,我想说这不行。但我想你明白了:)
【解决方案2】:

MySQL auto_increment 列在内部维护一个数字,并且将始终递增它,即使在删除之后也是如此。如果需要填空,必须在PHP中自己处理,而不是在表定义中使用auto_increment关键字。

如果您需要维护外键关系,则回滚以填充空行 ID 可能会导致各种困难,并且确实不建议这样做。

auto_increment 可以使用 SQL 语句重置,但不建议这样做,因为它会导致重复键错误。

-- Doing this will cause problems!
ALTER table AUTO_INCREMENT=12345;

编辑 要执行 cmets 中描述的外键关系,您应该在表定义中添加:

FOREIGN KEY (friendid) REFERENCES registration_table (id) ON DELETE SET NULL;

填写正确的表名和列名。现在,当用户从注册中删除时,他们的朋友关联将被取消。如果您需要与其他用户重新关联,则必须使用 PHP 来处理。 mysql_insert_id() 不再有用。

如果你需要在删除后在数据库中找到最高编号的id与朋友关联,请使用以下。

SELECT MAX(id) FROM registration_table;

【讨论】:

  • 我可以用 mysql_insert_id 做吗?
  • @Tural Teyyuboglu:mysql_insert_id() 获取最后插入的 id。如果您增加并存储该值,您可以在下一次插入时再次使用它。虽然这是不必要的,因为您已经知道上次插入时使用的 id。
  • @Tural Teyyuboglu 不,因为mysql_insert_id 只会检索最后使用的 ID。
  • 如果删除一行,mysql_insert_id() 仍然会返回最后插入的 id 并留出空隙。
  • 在我的注册表单中,新注册的用户可以写下已有用户的名字,注册后可以和他们成为好友。为了这个友谊,我有另一个表,将新注册用户和现有用户的 id 关联起来。为此,我在注册期间使用 mysql_insert_id 来获取新用户的 id。但是在 nex 注册过程中删除第 21 行后,mysql_insert_id 给了我 21 号。但存储在第 24 行。并将新用户放入关联表21。我想解决这个问题
【解决方案3】:

您可以通过在表中添加一个名为 user_order 的额外列来实现。然后,您可以编写代码来管理插入和删除,以便此列始终是连续的,没有间隙。

这样可以避免使用 auto_increment 列时可能会遇到的问题。

【讨论】:

    【解决方案4】:

    很容易,不。您可以做的(但我不建议这样做)是创建一个 SQL 函数来确定当前未占用的最低数字。或者,您可以创建一个已删除的 ID 表,并从中获取最小的数字。或者,这是最好的想法,忽略这些差距并意识到数据库是好的。

    【讨论】:

      【解决方案5】:

      自动增量是作为表的一部分进行跟踪的序列键。删除行时不会返回。

      【讨论】:

      • 请帮我实现我的想法
      【解决方案6】:

      当您使用自动增量 id 列时,将分配下一个条目的值不会因删除条目而减少。这不是自动增量列的用途。数据库引擎将始终在新插入时增加该数字,而在删除时永远不会减少该数字。

      【讨论】:

        猜你喜欢
        • 2014-10-01
        • 1970-01-01
        • 2021-03-14
        • 2010-10-04
        • 2015-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多