gpt4 book ai didi

PostgreSQL - 随机主键

转载 作者:行者123 更新时间:2023-11-29 11:18:34 28 4
gpt4 key购买 nike

我需要一个 PostgreSQL 表的主键。 ID 应由大约 20 个数字中的一个数字组成。

我是数据库的初学者,也没有使用过 PostgreSQL。我找到了一些随机 ID 的示例,但这些示例包含字符,而我只需要一个整数。

谁能帮我解决这个问题?

最佳答案

我猜你实际上是指随机的 20 位数字,因为 1 到 20 之间的随机数会快速重复并导致冲突。

您真正需要的可能不是随机数,它是一个看似随机但实际上是非重复伪随机序列的数字。否则,当发生碰撞时,您的插入将随机失败。

当我不久前想做这样的事情时,我询问了 pgsql-general 列表,得到了一条非常有用的建议:在正常序列上使用 feistel 密码。参见 this useful wiki example .感谢 Daniel Vérité 的实现。

例子:

postgres=# SELECT n, pseudo_encrypt(n) FROM generate_series(1,20) n;
n | pseudo_encrypt
----+----------------
1 | 1241588087
2 | 1500453386
3 | 1755259484
4 | 2014125264
5 | 124940686
6 | 379599332
7 | 638874329
8 | 898116564
9 | 1156015917
10 | 1410740028
11 | 1669489846
12 | 1929076480
13 | 36388047
14 | 295531848
15 | 554577288
16 | 809465203
17 | 1066218948
18 | 1326999099
19 | 1579890169
20 | 1840408665
(20 rows)

这些不是 20 位数字,但您可以通过将它们相乘并截断结果来填充它们,或者您可以修改 feistel 密码函数以产生更大的值。

要将其用于 key 生成,只需编写:

CREATE SEQUENCE mytable_id_seq;

CREATE TABLE mytable (
id bigint primary key default pseudo_encrypt(nextval('mytable_id_seq')),
....
);

ALTER SEQUENCE mytable_id_seq OWNED BY mytable;

关于PostgreSQL - 随机主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20890129/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com