PostgreSQL-随机主键 [英] PostgreSQL - random primary key

查看:20
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆