【发布时间】:2020-04-12 00:55:55
【问题描述】:
我有一列我想default 到指定范围内随机生成的int8。我还希望此列是唯一的,因此如果生成的随机值已经存在,则应重新滚动。
所以我的问题是,在 PostgreSQL 中执行上述操作最惯用的方法是什么,最好具有良好的性能并支持批量插入。
例如,如果我有一个包含 name 和 id 列的 Person 表,并且我希望 id 是 int8 范围内的随机唯一 (0, 999999)。我希望能够插入 Paul、Kelly、David 和 Katie 并得到如下内容:
| Name | id |
+-------+--------+
| Paul | 314563 |
| Kelly | 592103 |
| David | 127318 |
| Katie | 893134 |
没有重复的风险,也没有插入失败的风险。
范围不会大到足以让我安全地假设它们永远不会发生碰撞(即生日悖论)。
我还应该说我确实想要真正的不可预测的随机性,所以序列上的密码不会计算在内。
关于如何生成随机数有多种答案,所以问题的主要焦点是唯一性方面。
话虽如此,在任意大范围内均匀生成int8 的干净且有效的方法将不胜感激。当n > 2 ^ 53(可能更早)时,random() * n 开始出现间隙。
【问题讨论】:
-
请显示示例数据。一个唯一的随机生成的数字是什么意思?
-
编辑了问题。我的意思是
int8在我能够指定的范围内大致均匀生成。 -
这就是所谓的数据编码
-
@HimanshuAhuja 你是什么意思?
-
@LukStorms 密钥将用于 URL 和客户端代码内部,因此我不想透露创建顺序或行创建率/计数等信息。
标签: sql postgresql random