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: AUTO_INCREMENT, lpad, MySQL, PostgreSQL, SEQUENCE, SERIAL, ZEROFILL
novembro 17, 2011 às 7:23 pm |
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…
novembro 17, 2011 às 7:58 pm |
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