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.

Abraço,

-- 
[]s!!

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

Responder a