Copie a estrutura da tabela para uma nova tabela

95

Existe uma maneira de copiar a estrutura de uma tabela em uma nova tabela, sem dados, incluindo todas as chaves e restrições?

Alex S
fonte
Selecione * Into NewTableName From OldTableName Onde 1 = 2 stackoverflow.com/questions/2505728/…
Nityanand wachche

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)
coderhs
fonte
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.


fonte
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

Dimo Boyadzhiev
fonte
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.

ChssPly76
fonte
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

picmate 涅
fonte
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