Create Table as Select Dev Emocionado ...

Dias atrás, precisei criar uma tabela no PostgreSQL a partir de uma consulta SQL. Tarefa fácil, não fosse a ansiedade ou a idade, rs. Abri o DBeaver e executei no console:

CREATE TABLE nova_tabela AS
SELECT 
    coluna1
    , coluna2
FROM tabela_existente
WHERE condicao;

Não haveria problemas, se não precisasse das constraints, mas precisei e, tive que recriar a tabela que já estava preenchida com novos dados (com ids nulos). Aqui, precisamos lembrar que é necessário criar os índices e as constraints manualmente após a criação da tabela.

-- Defino o ID como a Chave Primária
ALTER TABLE nova_tabela
    ADD PRIMARY KEY (id);

No meu caso, só precisei da chave primária e, a da tabela original é um tipo SERIAL (ao criar a nova tabela a partir do SELECT o tipo SERIAL é criado como inteiro), então é necessário criar a sequência e vinculá-la à coluna conforme os comandos abaixo:

-- Crio a sequência.
CREATE SEQUENCE nova_tabela_id_seq;

-- Ajusto a sequência para começar após o maior id existente.
SELECT 
    SETVAL('nova_tabela_id_seq', COALESCE(MAX(id), 0) + 1, false) 
FROM nova_tabela;

-- Defino a sequência como valor padrão da coluna id.
ALTER TABLE nova_tabela 
    ALTER COLUMN id SET DEFAULT NEXTVAL('nova_tabela_id_seq');

-- Vinculo a sequência à tabela (para que seja excluída, se a tabela for).
ALTER SEQUENCE nova_tabela_id_seq OWNED BY nova_tabela.id;

O comando OWNED BY cria um vínculo de dependência, pois no caso de deletar a tabela criada, a sequência também será removida deixando de ocupar espaço na base de dados.

Obrigado e, até a próxima postagem!

© 2025 Breno S. de Alcântara. Todos os direitos reservados.