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
