Postgresql

在 PostgreSQL 中創建一個非序數 ID

  • January 16, 2018

如果我聲明一個列serial在 PostgreSql 中,它將按序數順序自動遞增。由於回滾等原因,最終結果可能不是連續的,但它或多或少是有序的。

我有一個使用者表,其中使用者 ID 設置為serial,因此從 1 開始遞增……但我寧願他們不是,因為它似乎要求某種序列號攻擊。

是否有一種相對簡單、相對高效的方法可以在 PostgreSQL 中創建自動人工 ID,以便 ID 隨機間隔開,並且您不應該期望 ID 987654321 遵循 ID 987654320?

但我寧願他們不是,因為這似乎要求某種序列號攻擊

除了我認為你給自己一種虛假的安全感之外,你可以通過為“真實”序列保留標識符的上半部分並用隨機位填充下半部分來做你想做的事情:

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

dbfiddle在這裡

引用自:https://dba.stackexchange.com/questions/195095