获取下一个未使用的ID?

时间:2010-12-15 17:19:22

标签: java mysql

目前我有一个不由我管理的数据库,我无法对其进行任何更改,id字段是一个smallint 2 unsigned,最多可以为65535个id条目。

我的问题是,由于上述限制,我需要重复使用ID,如何按顺序获取下一个可用的ID,或者如何管理具有上述限制的插入?

3 个答案:

答案 0 :(得分:8)

检查1是否免费。如果不是:

SELECT MIN(a.id) + 1 AS smallestAvailableId
FROM your_table AS a
LEFT JOIN your_table AS a2
        ON a2.id = a.id + 1
WHERE a2.id IS NULL

答案 1 :(得分:2)

从标签中我推断出你需要Java中的id。

我个人会避免加入桌子。由于你最多有64K行,我会select id from table加入Java并在Java中搜索id。搜索间隙的一种方法是首先对数组进行排序(在SQL或Java中);找到差距然后变得微不足道。

如果反复执行此操作,则可以缓存数组,并避免每次需要id时都运行SQL语句。

无论您做什么,如果有多个客户端写入数据库,您必须准备好处理竞争条件,其中多个客户端将尝试使用相同的ID。您的代码需要使用锁定或能够正常恢复以使用不同的ID重新尝试失败的插入(我假设id列上存在唯一性约束。)

答案 2 :(得分:0)

您采取的任何一种方法都可能会因为竞争条件而导致您出现问题,除非您知道您将在任何一个时刻只有一个客户端访问数据库。

要回答您的问题,您认为“可用”ID是什么?请详细说明。直到所有id都被使用了一个简单的

SELECT MAX(id) + 1 FROM table;

应该这样做。如果您为“可用”ID建立一个标准,例如,重新使用已标记为旧的所有ID,则可以执行以下操作:

SELECT MIN(id) FROM table WHERE is_old = 1; 

然后只取消标记所选的ID。