Existe uma maneira de copiar a estrutura de uma tabela em uma nova tabela, sem dados, incluindo todas as chaves e restrições?
Respostas:
Para uma cópia de esquema simples, use a cláusula like.
CREATE TABLE new_table_name ( like old_table_name including all)
CREATE TABLE new (like old, extra_column text);
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.
including constraints
não funciona no PostgreSQL 8.3
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
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.
E se
CREATE TABLE sample_table_copy AS (SELECT * FROM sample_table WHERE 1 = 2)