我有一个问题我不确定如何优雅地解决。
背景资料
我有一个小工具表。每个小部件都分配了一系列数字的ID,假设在1-999之间。值1-999在我的数据库中保存为" lower_range"和" upper_range"在一个名为" config"的表中。 当用户使用我的Web应用程序请求创建新窗口小部件时,我需要能够执行以下操作:
问题
我在上述逻辑中看到的问题是双重的:
任何建议将不胜感激。 感谢
答案 0 :(得分:2)
提前生成随机数并将其存储在表格中;确保数字是唯一的。然后,当您需要获取下一个号码时,只需检查已分配的号码并从表中获取下一个号码。所以,而不是
这样做:
GetNextId
函数变为return ids[currentMaxId+1]
要管理同步请求,您需要拥有一些生成正确序列的资源。最简单的可能是使用窗口小部件表中的键作为ids
数组中的索引。因此,首先在widgets
表中添加记录,获取其密钥,然后使用ids[key]
生成窗口小部件ID。
答案 1 :(得分:1)
创建一个表来存储密钥和'used'属性。
CREATE TABLE KEYS
("id" INTEGER, "used" INTEGER)
;
然后使用以下命令查找新密钥
select id
from KEYS
where used = 0
order by RANDOM()
limit 1
答案 2 :(得分:1)
不要生成随机数,只需从随机顺序列表中选择数字。
例如,制作一个数字列表1 - 999.使用Fisher-Yates或同等数据对该列表进行随机播放(即使您没有使用C#,也请参阅Randomize a List in C#。)
现在,您可以在列表中跟踪最近使用的索引。 (对列表进行洗牌应该只发生一次,然后存储并重用结果)。
粗糙的伪代码:
If config-file does not contain list of indices
create a list with numbers 1 - 999
Use Fisher-Yates to shuffle that list
// list now looks like 0, 97, 251, 3, ...
Write the list to the config file
Set 'last index used' to 0 and write to config file
end if
要使用它,
NextPK = myList[last-index-used]
last-index-used = last-index-used + 1
write last-index-used to config file
答案 3 :(得分:0)
获取并标记同时使用的ID(扩展Declan_K的答案):
替换为random_sequence值((从random_sequence中选择id,其中使用= 0 by random()),1);
从random_sequence中选择id,其中rowid = last_insert_rowid(); 6
当您用完“未使用”的序列表条目时,select将返回“blank”
我使用replace into,因为update没有last_insert_rowid()等于我可以看到。
答案 4 :(得分:-2)
你可以让sql创建一个主键,这会增加你向数据库添加一个ros的一次。