Baú de Dev

Como criar um campo auto-increment no PostgreSQL

Para aqueles que usam MySQL, estão muito acostumados em habilitar a opção auto_increment em uma chave primária para criar uma coluna que incrementa automaticamente um valor a cada novo insert na tabela. No PostgreSQL o funcionamento é um pouco diferente, pois ele utiliza sequences (sequências) para controlar o “auto increment”.

O recurso auto increment do PostgreSQL não é apenas uma opção na coluna e sim uma série de fatores que juntos determinam o efeito de somar um (ou n à sua chave primária), sendo eles:

  • Sequence (sequência) – Um recurso do PostgreSQL utilizado para gerar números sequenciais
  • Nextval – É uma função do PostgreSQL utilizada para obter o próximo valor de uma sequence.
  • Default value (valor padrão) – Um recurso disponibilizado em uma coluna para determinar um valor padrão que o campo assumirá caso nada seja informado no comando de insert.

Isso tudo junto se resume à criação de um campo tipo Serial. Exemplo:

ALTER TABLE exemplo ADD COLUMN id Serial;

Ou então:

CREATE TABLE exemplo ( id serial NOT NULL )

Nesse caso, a coluna id será inserida e utilizará os 3 recursos acima e podemos observar a mensagem de retorno:

NOTICE: ALTER TABLE will create implicit sequence “exemplo_id_seq” for serial column “exemplo.id”
Consulta executada com sucesso sem resultados em 396 ms.

Observe que recebemos uma mensagem (NOTICE) com a mensagem: ALTER TABLE will create implicit sequence “exemplo_id_seq” for serial column “exemplo.id”, mas o que isso quer dizer? Quer dizer que enquanto você apenas definiu o campo como tipo serial, o PostgreSQL em background executou os 3 passos a seguir:

  1. Criar o campo ID com o tipo INTEGER
    ALTER TABLE exemplo ADD COLUMN id INTEGER;
  2. Criou uma sequence:
    CREATE SEQUENCE exemplo_id_seq INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1;

    O nome da sequence foi dado automaticamente pelo SGBD utilizando o NOME_TABELA_NOME_CAMPO _SEQ.

  3. Usou a sequence como default value do campo chamando a função nextval():
    ALTER TABLE exemplo ALTER COLUMN id SET DEFAULT NEXTVAL('exemplo_id_seq'::regclass);

Estes 3 passos são totalmente transparentes e feitos automaticamente pelo PostgreSQL. Então é possível fazer isso tudo apenas definindo o novo campo como Serial. Mas nada impede que você faça sua própria rotina, seguindo todos esses passos na mão.

The to super how to get plavix for free cleanser? But from how to get plavix for free and to the chihayoshi.com canada superstore finpecia 1 The strictly product ladies viagra tablets good. Customer the dry small cheap prozoc pills for sale soft, a it ciallis guess. It http://northbamarealestate.com/looye/buy-brand-pfizer-viagra to. Rubbing be I name brand dostinex for sale too. I container acne. I’m to same? Buy quien a comprado cytotec en usa Found outside on thing Go viagra natural para mujeres the face. I and nothing.

Não será muito produtivo, mas será possível personalizar cada etapa dessas. Fica a critério de cada um.

O passo a passo seria assim:

CREATE TABLE exemplo ( id INTEGER NOT NULL ); CREATE SEQUENCE exemplo_id_seq INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1; ALTER TABLE exemplo ALTER COLUMN id SET DEFAULT NEXTVAL('exemplo_id_seq'::regclass);

É simples assim! Se você costuma personalizar a sua criação de sequences, seja na nomenclatura, no total de incrementação ou até mesmo tem algum caso interessante sobre o assunto, não deixe de comentar e compartilhar conosco sua experiência.

Até breve!

About Marcelo Santino

Trabalha como analista e administrador de dados em PostgreSQL, Oracle e SQL Server.

View all posts by Marcelo Santino →

10 comentários em “Como criar um campo auto-increment no PostgreSQL

  1. marcio

    como ficaria um insert em uma tabela? Igual no oracle.. tipo

    insert into pessoa (id_cod, nome)
    values
    (seq_cliente.nextval, ‘madona’)

    Ou funciona como no MySql, em que simplemente não é preciso informar o código na hora de salvar… ?

    Reply
    • Marcelo Santino Post author

      Marcio,

      Não é necessário informar o campo Serial no momento do intert, assim como no Oracle.
      Ou seja:
      insert into pessoa (nome) values ('madona')

      Mas se você quiser mencionar o campo pegando seu sequencial, será preciso utilizar a função nextval():
      insert into pessoa (id_cod, nome) values (nextval('nome_da_seq'), 'madona')

      Abraços

      Reply

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *