Copier la structure de la table dans une nouvelle table

91

Existe-t-il un moyen de copier la structure d'une table dans une nouvelle table, sans données, y compris toutes les clés et contraintes?

Alex S
la source

Réponses:

107

Pour une simple copie de schéma, utilisez la clause like.

CREATE TABLE new_table_name ( like old_table_name including all)
coderhs
la source
13
À noter que vous pouvez également ajouter de nouvelles colonnes lorsque vous utilisez la syntaxe similaire:CREATE TABLE new (like old, extra_column text);
Brad Koch
@BradKoch est-il possible d'ajouter des contraintes supplémentaires dans cette instruction? Ou ce devrait être un autre?
Andrey Deineko
@AndreyDeineko Cela dépend, consultez la documentation de création de table pour plus de détails. Vous pouvez facilement ajouter des contraintes de vérification et de clé étrangère à l'aide de cette syntaxe, comme avec n'importe quelle autre instruction create, mais je ne suis pas sûr que les contraintes au niveau de la colonne telles que not null puissent être appliquées sans modification ultérieure.
Brad Koch
2
J'ai essayé tout à l'heure. N'a pas copié les contraintes et les déclencheurs de clé étrangère (PostgreSQL 9.2).
Jānis Elmeris
73

Eh bien, le plus proche que vous pouvez obtenir avec SQL est:

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

Mais il ne copiera pas tout. Les éléments les plus importants qui manquent sont les CLÉS ÉTRANGÈRES. De plus, les déclencheurs ne sont pas copiés. Je ne suis pas sûr d'autres choses.

Une autre façon est de vider la structure de la table, de changer son nom dans le vidage et de la charger à nouveau:

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

Mais attention, un sed aussi simpliste changera aussi l'ancien en nouveau dans d'autres endroits (par exemple si vous avez dans votre colonne de table nommée "is_scolded" il deviendra "is_scnewed").

La question est plutôt: pourquoi en avez-vous besoin - car à des fins diverses, j'utiliserais différentes techniques.


la source
Remarque: including constraintsne fonctionne pas sur PostgreSQL 8.3
Ragnar123
1
A travaillé comme un charme dans Postgres 9.3 :)
Ganapathy
14
Meilleure réponse. Sachez simplement que si vous avez une valeur "série" ou une autre colonne par défaut à une séquence, elle utilisera la même séquence que l'ancienne table! Donc, si vous insérez des éléments dans l'une ou l'autre des tables, cela augmentera pour les deux.
sudo
19

Pour copier complètement un tableau, la forme courte utilisant la commande TABLE peut également être utilisée:

CREATE TABLE films2 AS
    TABLE films
    WITH NO DATA;

Plus de détails ici

Dimo Boyadzhiev
la source
Malheureusement, cela copie également les données - d'après ce que j'ai compris, la question est de ne copier que le schéma
Jasmine
🙁 Les identifiants sont NULL dans la nouvelle table et ne copient pas les valeurs par défaut.
ilhan le
10

Jetez un œil à pgAdmin - de loin le moyen le plus simple de faire ce que vous voulez.
Cliquez avec le bouton droit sur la table, Scripts - Créer.

ChssPly76
la source
Je n'ai accès qu'à phpPgAdmin; Je ne possède pas le serveur.
Alex S
C'est suffisant. Dans phpPgAdmin: accédez à la table, cliquez sur Exporter, sélectionnez "Structure uniquement" et vous avez votre script
ChssPly76
Je suis presque sûr qu'il doit y avoir un bogue dans cette installation - il montre juste une page blanche dans le bon cadre lorsque je fais cela: /
Alex S
1
Avez-vous essayé les deux options «afficher» ou «télécharger»? Si les deux ne fonctionnent pas, alors oui, cela pourrait être un bogue. Si tel est le cas, vous devrez le faire via SQL, jetez un œil au lien dans la réponse de Dav.
ChssPly76
Télécharger me donne juste un fichier vide.
Alex S
6

Que diriez-vous

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

réponse postgresql.org

picmate 涅
la source
3
Malheureusement, cela ne préserve pas les clés, les contraintes ou les valeurs par défaut.
sudo
1
Une meilleure façon d'exprimer 'WHERE 1 = 2' serait 'WHERE false' ou pas de clause WHERE du tout, mais 'LIMIT 0' à la place.
Kenyakorn Ketsombut