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

2024-02-13

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

背景资料

我有一张小部件表。每个小部件都分配有一个数字范围内的 ID,假设在 1-999 之间。 1-999 的值作为“lower_range”和“upper_range”保存在我的数据库中名为“config”的表中。 当用户请求使用我的网络应用程序创建新的小部件时,我需要能够执行以下操作:

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

Problem

我认为上述逻辑的问题有两个:

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

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


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

  • 生成 1-999 之间的数字
  • 检查是否已经分配
  • 生成新号码,依此类推。

do this:

  • 生成 999 个元素的数组,其值以某种随机顺序从 1 到 999
  • Your GetNextId函数变成return ids[currentMaxId+1]

要管理并发请求,您需要拥有一些能够生成正确序列的资源。最简单的可能是使用小部件表中的键作为ids大批。因此,添加一条记录widgets首先获取表,获取其密钥,然后使用生成小部件 IDids[key].

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 如何返回调用不同数据库中的存储过程的远程数据库名称?

    我在一个 SQL Server 2008 R2 上有许多不同的数据库 为了便于论证 我们将它们称为 DB A DB B 和 DB C 我被要求开发一个将存在于 DB A 上的存储过程 该存储过程将用于删除和创建索引 并在 DB A 的表中存
  • 如何在Redshift中进行分层随机样本?

    我需要对从不同类别购买商品的客户进行随机抽样 有8个类别 订单分布在其中 如果我想对已购买的客户进行随机抽样 但保持每个类别的订单比例相同 我将如何在我的 sql 代码中进行设置 下面的表格强调了这一点 它不包括客户数据 我希望我的客户列表
  • 需要 SQL 选择查询帮助

    我的问题类似于SQL选择组查询 https stackoverflow com questions 11407601 sql select group query 但模式发生了变化 我想要不同的结果 如下所述 给定链接的解决方案没有给我正确
  • 执行Insert命令并返回Sql中插入的Id

    我正在 MVC 4 中使用 C 将一些值插入到 SQL 表中 实际上 我想插入值并返回最后插入记录的 ID 我使用以下代码 public class MemberBasicData public int Id get set public
  • 我可以从列 CHECK 约束调用用户定义的函数吗?

    我有一个返回 1 或 0 的用户定义的 SQL 函数 我想从列 CHECK 约束中调用它 是的 SQL Anywhere 没有布尔数据类型 因此您必须编写一个生成 TRUE FALSE 或 UNKNOWN 的谓词 换句话说 如果函数返回 1
  • PostgreSQL 8.3 中不为空且唯一约束的增量字段

    我有一个表 项目 其中有一列 位置 位置具有唯一且非空的约束 为了在位置 x 插入新行 我首先尝试增加后续项目的位置 UPDATE items SET position position 1 WHERE position gt x 这会导致
  • 如何使用Python的Mysqldb模块?而不是 %s 作为查询参数?

    MySqlDb 是一个很棒的 Python 模块 但有一个部分非常烦人 查询参数如下所示 cursor execute select from Books where isbn s isbn 而已知宇宙中的其他地方 oracle sqlse
  • 关于数据库变更的通知

    我正在尝试一种场景 其中我想使用任何用户提交的更改来更新在不同 PC 上运行的桌面 UI 例如 Application1 安装在 PC1 PC2 和 PC3 上 假设所有 PC 都运行此应用程序 假设 PC1 上的用户 1 更改数据并提交到
  • Oracle DB & SQL Developer:“错误报告:执行已完成,但有警告” - 如何*查看*该警告?

    我正在设置一个本地 Oracle 11g 数据库 我们已经运行的另一个数据库的克隆 我正在 SQL Developer 中运行一堆生成的 PL SQL 命令 我得到输出 Error starting at line x in command
  • 如何增加每次 INSERT INTO 迭代的值?

    我有一个查询 如下所示 第 1 列位于 另一列是 varchar 100 INSERT INTO TABLE1 column1 column2 SELECT MAX column1 FROM TABLE1 1 anotherColumn F
  • PostgreSQL:用以前的值填充时间序列查询中的 NULL 值

    我有一个包含时间相关信息的数据库 我想要一个包含每分钟值的列表 像这样 12 00 00 3 12 01 00 4 12 02 00 5 12 03 00 5 12 04 00 5 12 05 00 3 但是 当几分钟内没有数据时 我得到如
  • 每组最大 n 个 SQL 查询的高性能方法

    我正在尝试构建一个基础设施 以便根据需要快速运行回归 从包含我们网络服务器上所有历史活动的数据库中提取 apache 请求 为了通过确保我们仍然回归来自较小客户的请求来提高覆盖范围 我想通过为每个客户检索最多 n 个 为了这个问题 假设 1
  • SQLite 中的非空字符串约束

    我可以创建数据库约束吗TEXT列于SQLite不允许列的值为空字符串 我想让该专栏成为null 但不允许空字符串 是的你可以 http sqlite org syntaxdiagrams html column constraint sql
  • postgresql to_json() 函数转义所有双引号字符

    我编写了一个 plpgsql 脚本 它在字符串中生成一个 json 对象数组 但是在我使用 to json 方法将带有该字符串的变量传递给它之后 它返回一个带双引号的结果 并且每个双引号字符都被转义 但我需要原样的字符串 jsonResul
  • 从存储过程执行SQL Server代理作业并返回作业结果

    需要有一个存储过程来调用 SQL Server 代理作业并返回作业是否成功运行 到目前为止我已经 CREATE PROCEDURE MonthlyData AS EXEC msdb dbo sp start job N MonthlyDat
  • 使用SQL参数绑定是否意味着可以直接从输入中输入文本?

    正如标题所说 如果我使用 SQL 参数 即 SQLCommand cmd new SQLCommand select from users where username user and password pass limit 1 Cxn
  • MySQL 更新具有多个值的查询

    我在数据库中有一个表 其记录如下 match id guess result 125 1 0 130 5 0 233 11 0 125 2 0 我的用户为每场比赛选择一个猜测 我有一个函数可以根据比赛的结果计算猜测的结果 如果猜测正确 结果
  • SQL 选择 ID 相同的多个最大行

    我在这方面一次又一次地挣扎 但无法让它发挥作用 在这些论坛上呆了几个小时 数据集 Row Date AccountID Column 1 1 21 02 2013 0 30 A0M8FA1003YP 2 21 02 2013 0 30 A0
  • 表中主键的最佳实践是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在设计表时 我养成了一种习惯 即有一列是唯一的 并且我将其作为主键 根据要求 可以通过三种方式实现 自动递增的标识整数列 唯一标识符 GUID
  • 我是否需要 SQL Server 数据库项目中链接服务器的数据库引用?

    在我的数据库项目中 我添加了对链接服务器的引用 当我在视图中使用此链接服务器并尝试构建数据库项目时 SSDT 报告错误 因为它无法理解对链接服务器上引用的任何架构的引用 LinkedServer DB1 dbo Table1 上面的代码会返

随机推荐