代码之家  ›  专栏  ›  技术社区  ›  neo

获取下一个未使用id的最有效方法

  •  5
  • neo  · 技术社区  · 15 年前

    Finding the lowest unused unique id in a list Getting unused unique values on a SQL table )

    +-----+-----+
    | id  |other|
    +-----+-----+
    

    id具有数字递增值。我的目标是获得最低的未使用id并创建该行。所以我第一次运行它当然会返回 0

    +-----+-----+
    | id  |other|
    +-----+-----+
    |  0  | ... |
    |  1  | ... |
    |  2  | ... |
    |  3  | ... |
    |  4  | ... |
    +-----+-----+
    

    通常这些行中的一些可能会被删除。假设id为的行 1 3 已删除。不,桌子看起来是这样的:

    +-----+-----+
    | id  |other|
    +-----+-----+
    |  0  | ... |
    |  2  | ... |
    |  4  | ... |
    +-----+-----+
    

    如果我现在再次运行查询,它会返回id 1 应创建此行:

    | id  |other|
    +-----+-----+
    |  0  | ... |
    |  1  | ... |
    |  2  | ... |
    |  4  | ... |
    +-----+-----+
    

    下次运行查询时,它应该返回id的 , 5 , 6

    运行这些查询的最有效方法是什么,因为我需要在一秒钟内频繁地执行它们(可以公平地假设id是表的唯一用途)?是否可以通过一个查询获得下一个未使用的行?或者通过引入另一个表来跟踪未使用的id,是不是更简单、更快?

    如果速度明显加快,还可以找到一种方法来重用表中的任何孔,前提是所有数字在某个时候都可以重用。

    附加问题:我计划使用SQLite来存储这种信息,因为除了存储这些id之外,我不需要数据库。有没有其他免费的(如语音)服务器可以完成这项工作 明显地 快一点?

    4 回复  |  直到 8 年前
        1
  •  2
  •   Community CDub    8 年前

    就像 Dennis Haarbrink 表示;删除时触发,插入时触发:

    id )

        2
  •  2
  •   Dennis Haarbrink    15 年前

    我想我应该在delete上创建一个触发器,然后插入旧id在另一张桌子上。

    免责声明:我不知道你使用什么数据库引擎,所以我不知道你是否可以使用触发器。

        3
  •  2
  •   OMG Ponies    15 年前

    数据库不关心这些值是否是连续的,只关心它们是唯一的。渴望拥有你的 id

    处理id值生成的最快和最安全的方法是依赖于提供唯一整数值的本机功能(即:SQLite的autoincrement)。使用触发器只会增加开销,使用MAX(id)+1是非常危险的。。。

    理想情况下,使用本机唯一整数生成器(SQLite/MySQL auto\ u increment、Oracle/PostgreSQL sequences、sqlserver IDENTITY)作为主键。如果希望值始终是连续的,请添加一个附加列以存储该连续值,并根据需要对其进行维护。MySQL/SQLite/SQL Server唯一整数生成只允许每列生成一个-序列更灵活。

        4
  •  1
  •   GrandmasterB    15 年前

    通常,您会让数据库处理分配ID。有没有什么特别的原因让你的id是连续的而不是唯一的?相反,你能给它们加时间戳,并在显示它们时给它们编号吗?或者为顺序id创建一个单独的列,并对它们重新编号?

    或者,您不能删除行本身,而是使用列中的标志将它们标记为已删除,然后通过查找编号最低的“已删除”行并重用该id来重新使用已标记行的id。