sql - 在数据库列中生成唯一的随机整数

标签 sql sql-server database tsql math

我的应用程序创建优惠券,每张优惠券都需要一个唯一的条形码编号。此数字必须是正整数,并且必须介于 6 - 12 位数字之间。这个数字代表一张唯一的优惠券,所以这个数字必须是唯一的。我不能简单地将条形码数字加 1,因为这将使黑客很容易猜出其他优惠券条形码。

如果我有一个优惠券数据库表,我如何生成这个随机条码编号并保证唯一性?

最佳答案

这将为您提供最多 12 位数字的随机数,并且几乎没有冲突。

select -convert(bigint, convert(varbinary(max), newid())) % 1000000000000

您需要测试并忽略冲突,并丢弃结尾少于 6 位的数字。


编辑

要首先使用最短的长度,您将无法使用真正的随机数生成器。这是因为一旦达到 6 位数范围的 95%,冲突就会非常高,以至于程序将所有时间都花在尝试和重试上,以获取尚未使用的唯一数字。一旦你只剩下一个数字,程序就可以永远等待并且永远不会“生成”那个数字。因此,为了实现“最低长度优先”,您实际上必须将所有数字生成到一个表中,然后随机生成行号(order by len(num), newid())它们,然后按顺序绘制它们出。

要将 0 填充到 12 位数字,请使用

select right('000000000000'
      +right(-convert(bigint, convert(varbinary(max), newid())),12),12)

关于sql - 在数据库列中生成唯一的随机整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5332582/

相关文章:

sql-server - M1 MacBook 上的 Ubuntu (20.10) Docker 镜像上的 MSSQL 工具

mysql - 使用mysql select结果制作二维坐标

MySQL有没有办法在选择查询中替换utf8字符?

sql - 时间戳到日期 SQL

sql-server - TSQL - 检查多条记录的最快方法是什么?

mysql - 从 VB.Net 读取和写入 SQL 信息

mysql - Heroku 的 Rails 数据库特定查询

database - C# 中的远程数据库连接新手

MySQL 查询 - 只想显示唯一的条目

mysql - 从 call_log 中获取并发电话的最大数量