Preciso criar um database model
que inclua um campo para armazenar valores exclusivos de 20 dígitos. Que será usado por muitos clientes em uma API.
O valor deve ter 20 dígitos, ser numérico e exclusivo. A melhor abordagem parecia criar um big-int
campo de incremento automático, mas big-int suporta valores de até 9223372036854775807 (19 dígitos). Usar numeric(20,0)
é inútil, pois embora o numérico suporte valores maiores, o Postgres 8.4 não me permite criar um sequence
e gera erro
CREATE SEQUENCE my_sequence_name INCREMENT BY 1 NO MINVALUE NO MAXVALUE START WITH 10000000000000000101;
ERRO: o valor "10000000000000000101" está fora do intervalo para o tipo bigint
Para integridade dos dados, devo lidar com isso no POstgresql. Qual é a maneira eficiente de lidar com isso?
Estou usando Postgresql 8.4 e Django 1.3
ATUALIZAÇÃO: Acho melhor fazer um esclarecimento... Estou tentando achar uma forma de resolver isso dentro do SGBD. Portanto, qualquer solução que não seja de banco de dados será evitada, a menos que eu não tenha outra escolha. Descanso é o motivo da minha pergunta:
Estou fazendo uma API que se comunica com um Banco para operações 3D seguras. A API do banco exigia um identificador numérico exclusivo de 20 dígitos para a transação, então decidi criar um valor de ID que eu possa usar tanto para a API do banco quanto para minha API que usará essa tabela etc.
A declaração de 10000000000000000101
é porque, a API do banco deseja que seja um valor válido de 20 dígitos integer
, portanto, deve ser pelo menos 10000000000000000000.
Resolver isso dentro do DBMS é melhor para desempenho e integridade de dados. Uma ideia que pensei foi armazenar o valor como um auto-increment big-integer
no campo do banco de dados e analisá-lo manualmente para string e fazer algumas configurações como:
bid = str(23434545) # value in the DB field
final_value = '1' + '0'* (19-len(bid)) + bid
que faz final_value
um inteiro de 20 dígitos que começa com 1 e termina com meu valor auto-incrementado. e o meio é preenchido com zeros.
Mas no caso de lidar com consultas SELECT
e INSERT
, manter a lógica fora do DBMS é baixo, tão ruim.
Se você pode conviver com a perda de alguns valores para o valor máximo, pode combinar uma sequência com um deslocamento fixo para obter os 20 dígitos. Eu também definiria uma restrição de verificação na tabela para garantir que inserções acidentais sem usar o valor padrão insiram o valor errado:
Isso fornecerá um valor máximo gerado de 19223372036854775808, que não usa o intervalo completo de valores permitidos, mas pode ser suficiente para suas necessidades.
Uma solução simples seria fazer o acréscimo no lado do servidor assim: