sql >> Base de Datos >  >> RDS >> PostgreSQL

Reemplazo de secuencia con número aleatorio

Para generar identificadores únicos y de aspecto aleatorio a partir de una serie, puede ser una buena idea utilizar cifrados. Dado que su salida es biyectiva (hay un mapeo uno a uno entre los valores de entrada y salida), no tendrá ninguna colisión , a diferencia de los hashes. Lo que significa que sus identificadores no tienen que ser tan largos como hashes.

La mayoría de los cifrados criptográficos funcionan en bloques de 64 bits o más grandes, pero el wiki de PostgreSQL tiene un procedimiento PL/pgSQL de ejemplo para un cifrado "no criptográfico" función que funciona en (32 bits) int escribe. Descargo de responsabilidad:no he intentado usar esta función yo mismo.

Para usarlo para sus claves principales, ejecute la llamada CREATE FUNCTION desde la página wiki y luego en su vacío las tablas hacen:

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

¡Y listo!

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)