Ser Programador

Como atualizar a sequência dos campos SERIAL no PostgreSQL

Neste artigo apresento de forma simples como alterar as sequences do PostgreSQL.


Olá, pessoal!

Há vezes em que a sequence no PostgreSQL fica com um valor diferente do último ID inserido no campo SERIAL da tabela. Isso costuma ocorrer em tabelas que recebem manutenção manual constantemente, ou bancos de dados que sofreram algum restore ou alguma ocasião do tipo.

Quanto ocorre deste campo SERIAL ser uma primary key, ao inserir um registro nessa tabela, o ID que será criado muito provavelmente será um ID já existente, e será gerado um erro de banco de dados.

Para corrigir isto é bem simples. Primeiro precisamos visualizar os campos da tabela e descobrir o nome da sequence que rege esse campo SERIAL acessando as propriedades do campo.

Imagine que estamos trabalhando com uma tabela chamada tb_menu e o campo id_menu tem uma sequence chamada tb_menu_id_menu_seq.

Conseguimos visualizar as propriedades dessa sequence efetuando a seguinte consulta:

        SELECT * FROM tb_menu_id_menu_seq;
    

No retorno:


Para descobrir qual o último ID inserido na tabela, podemos efetuar a consulta:

        SELECT MAX(id_menu) FROM tb_menu;
    

Há quem use a seguinte consulta para obter o mesmo resultado:

        SELECT id_menu FROM tb_menu ORDER BY id_menu DESC LIMIT 1;
    

Como já dizia um amigo meu, existem infinitas formas de se fazer neston. Em minha sincera opinião, desta forma há redundâncias demais.


O comando para atualizar a sequence não aceita subqueries, portanto devemos primeiro consultar o último valor inserido na tabela. Imaginemos que o último ID do campo id_menu é 777; desta forma efetuamos a correção da sequence da seguinte forma:

        ALTER SEQUENCE tb_menu_id_menu_seq RESTART WITH 777;
    

Resolvido! Simples quanto!