PostgreSQL-随机主键 [英] PostgreSQL - random primary key
本文介绍了PostgreSQL-随机主键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我需要一个PostgreSQL表的主键。ID应该由大约20个数字中的一个数字组成。
我是数据库的初学者,也没有使用过PostgreSQL。我找到了一些随机id的示例,但这些示例包含字符,我只需要一个整数。
有人能帮助我解决此问题吗?
推荐答案
我猜您实际上是指随机的20位数字,因为1到20之间的随机数字会迅速重复并导致冲突。
您需要的可能不是实际的随机数,它是看起来随机的数字,而实际上是一个不重复的伪随机序列。否则,当发生冲突时,插入将随机失败。
不久前,当我想要做这样的事情时,我询问了pgsql-General列表,得到了一个非常有用的建议:在正常序列上使用feistel密码。请参见this useful wiki example。实施工作应归功于丹尼尔·贝里特。示例:
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密码函数以生成更大的值。
要将其用于密钥生成,只需编写:
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-随机主键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文