Jer*_*acs 0 postgresql primary-key uniqueidentifier
如果我在 PostgreSql 中声明一列serial
,它将按顺序自动递增。由于回滚等原因,最终结果可能不连续,但或多或少是有序的。
我有一个用户表,其中用户 ID 设置为serial
,因此从 1 开始递增...但我宁愿它们不是,因为这似乎要求某种序列号攻击。
是否有一种相对简单、相对高效的方法可以在 PostgreSQL 中创建自动人工 ID,使 ID 随机间隔开,并且您不应该期望 ID 987654321 位于 ID 987654320 后面?
但我宁愿他们不是,因为这似乎是在要求某种序列号攻击
除了我认为您给自己一种错误的安全感这一事实之外,您还可以通过保留“真实”序列标识符的上半部分并用随机位填充下半部分来完成您想要的操作:
Run Code Online (Sandbox Code Playgroud)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;
富| 序列 ----------: | --: 4294967296 | 1 8589934592 | 2 12884901889 | 3 17179869185 | 4 21474836481 | 5 25769803777 | 6 30064771073 | 7 34359738369 | 8 38654705664 | 9
dbfiddle在这里
归档时间: |
|
查看次数: |
2538 次 |
最近记录: |