Copie a estrutura da tabela para uma nova tabela


Respostas:


112

Para uma cópia de esquema simples, use a cláusula like.

CREATE TABLE new_table_name ( like old_table_name including all)

13
É importante notar que você também pode adicionar novas colunas ao usar a sintaxe semelhante:CREATE TABLE new (like old, extra_column text);
Brad Koch

@BradKoch é possível adicionar restrições extras nesta instrução? Ou deve ser um separado?
Andrey Deineko

@AndreyDeineko Depende, verifique os documentos de criação da tabela para obter todos os detalhes. Você pode adicionar facilmente restrições de verificação e de chave estrangeira usando essa sintaxe, assim como com qualquer outra instrução de criação, mas não tenho certeza se as restrições de nível de coluna como not null podem ser aplicadas sem uma alteração subsequente.
Brad Koch

2
Tentei agora mesmo. Não copiou restrições de chave estrangeira e gatilhos (PostgreSQL 9.2).
Jānis Elmeris

76

Bem, o mais próximo que você pode chegar com SQL é:

create table new (
    like old
    including defaults
    including constraints
    including indexes
);

Mas não vai copiar tudo. As coisas mais importantes que faltam são CHAVES ESTRANGEIRAS. Além disso, os gatilhos também não são copiados. Não tenho certeza sobre outras coisas.

Outra maneira é despejar a estrutura da tabela, alterar seu nome no despejo e carregá-la novamente:

pg_dump -s -t old databases | sed 's/old/new/g' | psql

Mas tome cuidado, pois esse sed simplista também mudará de antigo para novo em outros lugares (por exemplo, se você tiver na sua tabela a coluna chamada "is_scolded", ela se tornará "is_scnewed").

A questão realmente é: por que você precisa disso - porque, para vários fins, eu usaria técnicas diferentes.


Observação: including constraintsnão funciona no PostgreSQL 8.3
Ragnar123

1
Funcionou como um encanto no Postgres 9.3 :)
Ganapathy

15
Melhor resposta. Apenas tome cuidado, pois se você tiver um valor "serial" ou alguma outra coluna padronizada para uma sequência, ela usará a mesma sequência da tabela antiga! Portanto, se você inserir itens em qualquer uma das tabelas, ele aumentará para ambas.
sudo

22

Para copiar uma tabela completamente, a forma abreviada usando o comando TABLE também pode ser usada:

CREATE TABLE films2 AS
    TABLE films
    WITH NO DATA;

Mais detalhes aqui


Infelizmente, isso copia os dados também - pelo que entendi, a questão é sobre como copiar apenas o esquema
Mewtwo

🙁 ids são NULL na nova tabela e não copiam os valores padrão.
ilhan

10

Dê uma olhada no pgAdmin - de longe a maneira mais fácil de fazer o que você deseja.
Clique com o botão direito na tabela, Scripts - Criar.


Eu só tenho acesso ao phpPgAdmin; Não sou proprietário do servidor.
Alex S

Justo. No phpPgAdmin: navegue até a tabela, clique em Exportar, selecione "Somente estrutura" e você terá seu script
ChssPly76

Tenho certeza de que deve haver um bug nesta instalação - ele apenas mostra uma página em branco no quadro correto quando eu faço isso: /
Alex S

1
Você tentou as opções "mostrar" ou "baixar"? Se ambos não funcionarem, então sim, pode ser um bug. Em caso afirmativo, você precisará fazer isso via SQL, dê uma olhada no link na resposta de Dav.
ChssPly76

Baixar apenas me dá um arquivo vazio.
Alex S

6

E se

CREATE TABLE sample_table_copy AS (SELECT * FROM sample_table WHERE 1 = 2)

resposta postgresql.org


3
Infelizmente, isso não preserva chaves, restrições ou padrões.
sudo

1
Uma maneira melhor de expressar 'WHERE 1 = 2' seria 'WHERE false' ou nenhuma cláusula WHERE, mas 'LIMIT 0' em seu lugar.
Kenyakorn Ketsombut
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.