admin

为表中的主键随机生成1-999之间的唯一数字

sql

我有一个问题,我不确定如何优雅地解决。

背景资料

我有一个小部件表。每个小部件都从一系列数字(例如1-999之间)中分配了一个ID。1-999的值在名为“ config”的表中保存为“
lower_range”和“ upper_range”。当用户请求使用我的Web应用程序创建新的窗口小部件时,我需要执行以下操作:

  • 使用lua的math.random函数生成一个1到999之间的随机数,或者使用sqlite生成一个随机数生成器(到目前为止,在我的测试中,lua的math.random总是返回相同的值…但这是一个不同的问题)
  • 做一个选择语句,看看是否已经有一个分配了这个数字的小部件…
  • 如果没有,请创建新的小部件。
  • 否则,请重复此过程,直到获得当前未使用的号码。

问题

我发现上述逻辑有两个问题:

  1. 该算法可能会花费很长时间,因为我必须继续搜索直到找到唯一的值。
  2. 如何防止同时请求新的小部件编号生成相同的值?

任何建议,将不胜感激。谢谢


阅读 271

收藏
2021-06-07

共1个答案

admin

提前生成您的随机数并将其存储在表格中;确保数字是唯一的。然后,当您需要获取下一个号码时,只需检查已经分配了多少个号码,然后从表格中获取下一个号码即可。所以,代替

  • 产生介于1-999之间的数字
  • 检查是否已分配
  • 生成一个新的数字,依此类推。

做这个:

  • 生成999个元素的数组,这些数组以某种随机顺序具有值1-999
  • 您的GetNextId功能变为return ids[currentMaxId+1]

要管理同时发生的请求,您需要具有一些生成正确序列的资源。最简单的方法可能是将小部件表中的键用作ids数组中的索引。因此,首先将记录添加到widgets表中,获取其键,然后使用生成窗口小部件ID
ids[key]

2021-06-07