目前我有一个不由我管理的数据库,我无法对其进行任何更改,id字段是一个smallint 2 unsigned,最多可以为65535个id条目。
我的问题是,由于上述限制,我需要重复使用ID,如何按顺序获取下一个可用的ID,或者如何管理具有上述限制的插入?
答案 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。