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:

Passo 1. Criar o campo ID com o tipo INTEGER

ALTER TABLE exemplo ADD COLUMN id integer;

Passo 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.

Passo 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. 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.