PostgreSQL com “ZEROFILL” e “AUTO_INCREMENT”

Este artigo é dirigido especialmente àqueles que vêm do MySQL para o Postgres.
Dois recursos interessantes que existem no MySQL, o ZEROFILL (preenchimento com zeros à esquerda) e o  AUTO_INCREMENT (incremento automático).

Como fazer o AUTO_INCREMENT no PostgreSQL

O recurso de auto incremento no Postgres é feito através de SEQUENCES (sequências), que é um tipo de objeto que armazena sequências.
Em um exemplo mais simples criamos a tabela sem criar a SEQUENCE explicitamente. A palavra chave SERIAL, na verdade é o tipo INTEGER e faz com que uma sequência seja criada implicitamente para o campo:

CREATE TABLE tb_teste(
id SERIAL PRIMARY KEY
);

Dentre as mensagens exibidas após o comando acima, destaca-se:

NOTICE: CREATE TABLE will create implicit sequence “tb_teste_id_seq” for serial column “tb_teste.id”

Vejamos a descrição da tabela:

\d tb_teste

Table “public.tb_teste”
column | Type    | Modifiers
——–+———+——————————————————-
id          | integer  | not null default nextval(‘tb_teste_id_seq’::regclass)
Indexes:
“tb_teste_pkey” PRIMARY KEY, btree (id)

Como podemos ver, não existe “mágica” e sim LÓGICA! :) -> Se quiser um auto incremento, tem que ter uma sequência, a qual é o valor padrão do campo ao qual está associada, nem que seja criada implicitamente.

Criação de uma Sequência

Incrementa com razão = 1 (lembre-se das aulas de progressão aritimética ;) ), valor mínimo = 0, valor máximo = 99999:

CREATE SEQUENCE sq_exemplo INCREMENT 1 MINVALUE 0 MAXVALUE 99999;

Enfim, o ZEROFILL

Criação da Tabela

CREATE TABLE tb_exemplo(

id CHAR(5) DEFAULT lpad(nextval(‘sq_exemplo’)::CHAR(5),5,’0′) PRIMARY KEY
);

Repare que desta vez houve a mensagem de criação de sequência implícita. Isso porque a mesma foi criada explicitamente.

E onde está o EFEITO ESPECIAL?

1 – A restrição DEFAULT, que atribui um valor padrão ao campo;
2 – A função nextval que retorna o próximo valor da sequência, sua sintaxe é: nextval(‘nome_da_sequence’);
3 – A função lpad que recebe aqui três parâmetros: text, integer e text.
No primeiro parâmetro, nextval(‘sq_exemplo’)::CHAR(5), como a função nextval retorna um integer, foi preciso converter para um formato texto, que no caso foi CHAR(5).
No segundo parâmetro, 5 é o tamanho máximo da string que será preenchida com zeros à esquerda.
E no terceiro parâmetro, ’0′, é o caractere que será usado para preencher à esquerda caso de a string (primeiro parâmetro) for menor que o tamanho máximo (segundo parâmetro).

Teste e Conclusão

INSERT INTO tb_exemplo VALUES (DEFAULT),(DEFAULT),(DEFAULT),(DEFAULT),(DEFAULT);

O comando acima é um INSERT múltiplo na tabela que só tem um campo e que o mesmo possui um valor padrão (DEFAULT) e esse valor é o próximo numero da sequência, com preenchimento de zeros à esquerda.

Agora vejamos o resultado:

SELECT * from tb_exemplo ;

id
——-
00000
00001
00002
00003
00004
00005
(6 rows)

Vale a pena repetir os testes para ver  os valores inseridos.

Enfim, confie no poder do grande elefante e tome suas rédeas para dominá-lo XD.

Tags: , , , , , ,

2 Respostas para “PostgreSQL com “ZEROFILL” e “AUTO_INCREMENT””

  1. Bruno Disse:

    Legal… to vindo do mysql e agora preciso trabalhar com o postgres. Agora tenho uma dúvida, queria adicionar esses zeros somente no momento da pesquisa (select), pois a tabela já existe e pra ficar legal no relatório precisava adicionar esses zeros…

  2. juliano777 Disse:

    Olá, Bruno.

    Obrigado por comentar.

    Vamos lá, vou te dar um exemplo pra ficar mais fácil.

    Suponha uma simples tabela:

    CREATE TABLE tb_teste(
    valor int);

    Vou inserir um valor qualquer:

    INSERT INTO tb_teste (valor) VALUES (99);

    Até aqui nada de novo… rs

    Com a função lpad tudo se resolve:

    SELECT lpad(valor::TEXT,7,’0′) FROM tb_teste;

    lpad
    ——-
    0000099
    (1 row)

    Você pode ainda colocar um alias para o campo para ficar mais amigável:

    SELECT lpad(valor::TEXT,7,’0′) AS “Valor” FROM tb_teste;

    Valor
    ——-
    0000099
    (1 row)

    A função lpad nesse caso está recebendo 3 (três) parâmetros, respectivamente:

    valor de entrada (TEXT)
    quantidade de caracteres de preenchimento (INTEGER)
    preenchimento (TEXT)

    Propositalmente criei a tabela cujo valor de entrada NÃO é do tipo TEXT. Por isso foi preciso fazer a conversão:

    valor::TEXT

    Espero ter ajudado um pouco mais e seja bem vindo ao mundo do PostgreSQL!

    Fez a escolha certa!

    []s

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s


Seguir

Obtenha todo post novo entregue na sua caixa de entrada.