PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Sostituzione della sequenza con un numero casuale

Per generare identificatori univoci e dall'aspetto casuale da un seriale, l'utilizzo di cifrari potrebbe essere una buona idea. Poiché il loro output è biunivoco (c'è una mappatura uno-a-uno tra i valori di input e di output), non avrai alcuna collisione , a differenza degli hash. Ciò significa che i tuoi identificatori non devono essere lunghi quanto gli hash.

La maggior parte dei codici crittografici funziona su blocchi a 64 bit o più grandi, ma il wiki di PostgreSQL ha un esempio di procedura PL/pgSQL per una cifra "non crittografica" funzione che funziona su (32-bit) int genere. Dichiarazione di non responsabilità:non ho provato a utilizzare questa funzione da solo.

Per usarlo per le tue chiavi primarie, esegui la chiamata CREATE FUNCTION dalla pagina wiki, quindi sul tuo vuoto le tabelle fanno:

ALTER TABLE foo ALTER COLUMN foo_id SET DEFAULT pseudo_encrypt(nextval('foo_foo_id_seq')::int);

E voilà!

pg=> insert into foo (foo_id) values(default);
pg=> insert into foo (foo_id) values(default);
pg=> insert into foo (foo_id) values(default);
pg=> select * from foo;
  foo_id   
------------
 1241588087
 1500453386
 1755259484
(4 rows)