Em 10/10/11, Nei Rauni Santos<[email protected]> escreveu:
> Pessoal,
>
> Atualmente minha chave primária da tabela é um ID sequencial em uma coluna
> do tipo INTEGER.
>
> Preciso fazer com que os novos registros entrem com um ID não sequencial,
> estou pensando em fazer algo assim:
>
>
>
> CREATE OR REPLACE FUNCTION inquiry.generate_id( size integer)
>   RETURNS BIGINT AS
> $BODY$
> DECLARE
>   _SIZE ALIAS FOR $1;
>   _CODE BIGINT;
>   _NUMBERS INTEGER[];
> BEGIN
>
>   FOR i IN 1.._SIZE LOOP
>
>     IF i = 1 THEN
>     _NUMBERS[ i ] := COALESCE( trunc(random() * (9-0) + 0), 1);
>     ELSE
>     _NUMBERS[ i ] := trunc(random() * (9-0) + 0);
>     END IF;
>
>     SELECT INTO _CODE array_to_string( _NUMBERS, '' );
>
>   END LOOP;
>
>   WHILE ( ( SELECT count(*) FROM inquiry.inquiry where id = _CODE ) > 0 )
> LOOP
>    _CODE := inquiry.generate_id( _SIZE );
>   END LOOP;
>
>   RETURN _CODE;
> END;
>
> $BODY$
>   LANGUAGE plpgsql VOLATILE
>   COST 100;
>
> chamando a função irá retornar um bigint com 10 posições:
>
> SELECT inquiry.generate_id( 10 );
> 4624763011
> 3018760860
> 3272802221
> 2685162564
>
> obs. o número nunca poderá comecar com zero.
>
>
> Gostaria da opnião de vocẽs e quem sabe sugestões para melhorar essa função.
>


Avalie a utilização de Universally Unique Identifiers (UUID):
http://www.postgresql.org/docs/current/interactive/datatype-uuid.html

São 32 algarismos hexadecimais (128 bits) mas você terá uma garantia
de unicidade.

Osvaldo
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a