在 PostgreSQL 中创建一个非序数数字 ID

Jer*_*acs 0 postgresql primary-key uniqueidentifier

如果我在 PostgreSql 中声明一列serial,它将按顺序自动递增。由于回滚等原因,最终结果可能不连续,但或多或​​少是有序的。

我有一个用户表,其中用户 ID 设置为serial,因此从 1 开始递增...但我宁愿它们不是,因为这似乎要求某种序列号攻击。

是否有一种相对简单、相对高效的方法可以在 PostgreSQL 中创建自动人工 ID,使 ID 随机间隔开,并且您不应该期望 ID 987654321 位于 ID 987654320 后面?

Jac*_*las 5

但我宁愿他们不是,因为这似乎是在要求某种序列号攻击

除了我认为您给自己一种错误的安全感这一事实之外,您还可以通过保留“真实”序列标识符的上半部分并用随机位填充下半部分来完成您想要的操作:

create sequence seq;
Run Code Online (Sandbox Code Playgroud)
create table tab(
  foo bigint 
      default (nextval('seq')<<32)+(random()*(1<<32))::integer
      primary key
);
Run Code Online (Sandbox Code Playgroud)
insert into tab select from generate_series(1,9);
Run Code Online (Sandbox Code Playgroud)
select foo, foo>>32 seq from tab;
Run Code Online (Sandbox Code Playgroud)
        富| 序列
----------: | --:
 4294967296 | 1
 8589934592 | 2
12884901889 | 3
17179869185 | 4
21474836481 | 5
25769803777 | 6
30064771073 | 7
34359738369 | 8
38654705664 | 9

dbfiddle在这里