【问题标题】:Get unused id from a field with "AUTO_INCREMENT" - mysql从具有“AUTO_INCREMENT”的字段中获取未使用的 id - mysql
【发布时间】:2014-01-18 23:09:37
【问题描述】:

假设我在表中有一个名为 tb_example 的字段,名为 id。此 id 具有 AUTO_INCREMENT 属性。因此,在每个新插入中,它都会像 1、2、3、...... 等等。

现在假设有 10 行 id 为 1-10 的数据。有人删除了id=5 所在的数据。现在对于下一个插入,我想在 position 5 NOT IN 11 中插入数据,而且我想在插入之前获得 unused id。这意味着我想获取未使用的 id 并使用查询插入下一个数据,如

"INSERT INTO tb_example .......... WHERE id=".$unused_id;

是否有可能通过任何简单的函数或进程来获得未使用的id 还有可能在一个范围内获得未使用的id?就像我想知道在 100 到 200 之间是否存在任何未使用的 id?还是我需要用逻辑编码找到id?请帮忙....

【问题讨论】:

  • 旁注:如果 MySQL 允许这样做,我会感到惊讶 - 您可能需要具有一些复杂的分配 ID 逻辑的常规列(并确保您正确处理“给/保留我”的多个请求最低未使用 id")
  • 为什么要这样做?
  • @RafeKettler 我需要在现有的会计软件中处理他们的参考系统。
  • 这将是,它只会捕获紧跟在现有 ID 前面的缺失 ID,但您可以尝试这种方法:SELECT q.id + 1 FROM tb_example q WHERE NOT EXISTS (SELECT w.id FROM tb_example w WHERE w.id = q.id + 1) ORDER BY q.id ASC LIMIT 1

标签: php mysql auto-increment


【解决方案1】:

摩擦最小的方法可能是有一个单独的表来记录每次删除记录时插入的可重用 ID(最好使用触发器)。当你想插入一条新记录时,看看这个表,看看是否有 ID 可以重用。如果是这样,请使用它们;如果没有,请正常插入。这也应该使您可以轻松地在某个范围内找到未使用的 ID。如果存储每个可回收 ID 的后备表中的列被索引,这应该很快。

【讨论】:

    【解决方案2】:

    我认为没有必要。首先,如果要这样做,它必须在索引(树?)中搜索任何未使用的数字。想象一下,如果您有一百万行,那么即使是简单的插入也会很慢。 id 也可以用作插入的基本顺序,如果您开始重用,那么这将被破坏。

    【讨论】:

    • 说扫描整个表是唯一的方法是不合理的。您可以将已删除的 ID 存储在单独的表中。但你是对的,这可能没有用例。
    • 为什么我会问我是否不需要这个?我只是不明白为什么 stackoverflow 中的人们更多地考虑用例而不是解决方案。无论如何,我需要在现有的会计软件中使用它。不,他们最多只有 5000 行,不同的帐户使用不同的 id 范围。
    • 我只会为空闲的 id 保留一个单独的表,也许可以尝试在删除时添加到 id 表的 sql 触发器。不知道如何设置。 @Rafe 你是对的,我没有考虑太多
    猜你喜欢
    • 2013-07-27
    • 2012-05-31
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 2018-07-22
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多