Existe-t-il un équivalent de SHOW CREATE TABLE de MySQL dans Postgres?

66

Existe-t-il un équivalent de MySQL SHOW CREATE TABLEdans Postgres? Est-ce possible? Si non, quelle est la meilleure solution?

J'ai besoin de cette déclaration car je l'utilise pour créer la table sur un serveur distant (via WCF).

vlebar
la source
Et je pensais que MySQL était la base de données manquant de toutes les fonctionnalités intéressantes ...
Christopher K.

Réponses:

27

Vous pouvez essayer de tracer dans le fichier journal PostgreSQL ce que fait réellement "pg_dump -t table -s". Ensuite, vous pouvez utiliser la même méthode pour écrire votre propre fonction SQL.

RJS
la source
ok, j'ai tracé le pg_dump. Mais ce n'était pas aussi facile, car je devais écrire ma propre fonction en C # pour écrire l'instruction create table. Mais c’était une grande aide, alors merci beaucoup, veeeeerrrryyyy. : D
vlebar
Pas besoin d'aller à tout ce mal - selon ici , vous pouvez utiliser l' -Eoption de tracer ce qui se passe en arrière - plan lorsque vous exécutez une psqlcommande - -E: will describe the underlaying queries of the \ commands (cool for learning!)- HTH!
Vérace
40

pg_dump:

pg_dump -st tablename dbname

ou utilisez les outils de l’interface graphique de PostgreSQL (pgAdmin, phpPgAdmin, etc.)

Alvosu
la source
Je vais essayer d'expliquer le problème plus en détail. J'ai besoin de l'instruction SQL (select ou procédure stockée) parce que j'exécute la commande SQL en C # (NpgsqlCommand). Donc, je pense que le pg_dump n'est pas la solution dans ce cas. :(
vlebar
1
Pourquoi pas? --schema-onlya exactement cet objectif: Afficher les instructions SQL pour créer le schéma / la table. Vous pouvez ensuite alimenter cette sortie dans votre programme C #.
Sven
Regardez les vues information_schema: postgresql.org/docs/9.0/interactive/information-schema.html
alvosu
1
@SvenW: Je le ferais si j'avais un ensemble de tables connu. Le problème est que l'utilisateur peut, s'il le souhaite, synchroniser n'importe quelle table de la base de données sélectionnée, puis créer la table sélectionnée sur un serveur distant derrière un service wcf. Je peux le faire avec mssql et maintenant je veux étendre le programme client à d’autres serveurs SQL (mysql, oracle, postgresql, ...) OK, je peux faire pg_dump pour une table que l’utilisateur veut synchroniser, mais si tout possible de le faire juste dans plsql, je veux le faire dans plsql
vlebar
1
En cas de vidage .tar, récupérez le restore.sqlfichier de l'archive. Il a toutes les déclarations de création.
Joseph Lust
15

En ligne de commande ( psql), vous pouvez exécuter: \d <table name>pour répertorier toutes les colonnes, leurs types et leurs index.

Lukasz Czerwinski
la source
5
Ceci est utile, mais ne répond pas à la question.
Ryan Tuck
4

En vous appuyant sur la première partie de la réponse de @ CubicalSoft, vous pouvez ajouter la fonction suivante, qui devrait fonctionner pour des tables simples (suppose le schéma par défaut "public" et omet les contraintes, les index et les types de données définis par l'utilisateur, etc.). @RJS answer est le seul moyen de le faire correctement pour le moment; c'est quelque chose qui devrait être intégré à psql!

CREATE OR REPLACE FUNCTION show_create_table(table_name text, join_char text = E'\n' ) 
  RETURNS text AS 
$BODY$
SELECT 'CREATE TABLE ' || $1 || ' (' || $2 || '' || 
    string_agg(column_list.column_expr, ', ' || $2 || '') || 
    '' || $2 || ');'
FROM (
  SELECT '    ' || column_name || ' ' || data_type || 
       coalesce('(' || character_maximum_length || ')', '') || 
       case when is_nullable = 'YES' then '' else ' NOT NULL' end as column_expr
  FROM information_schema.columns
  WHERE table_schema = 'public' AND table_name = $1
  ORDER BY ordinal_position) column_list;
$BODY$
  LANGUAGE SQL STABLE;
EoghanM
la source
Cela devrait être la réponse acceptée
exebook
Merci pour ça!
franc
3

Je me rends compte que je suis un peu en retard pour cette soirée, mais comme c'était le premier résultat de ma recherche sur Google, je me suis dit que je répondrais avec ce que j'ai proposé.

Vous pouvez aller assez loin vers une solution avec cette requête pour obtenir les colonnes:

SELECT *
FROM information_schema.columns
WHERE table_schema = 'YOURSCHEMA' AND table_name = 'YOURTABLE'
ORDER BY ordinal_position;

Et puis cette requête pour les index les plus courants:

SELECT c.oid, c.relname, a.attname, a.attnum, i.indisprimary, i.indisunique
FROM pg_index AS i, pg_class AS c, pg_attribute AS a
WHERE i.indexrelid = c.oid AND i.indexrelid = a.attrelid AND i.indrelid = 'YOURSCHEMA.YOURTABLE'::regclass
ORDER BY" => "c.oid, a.attnum

Ensuite, il suffit de construire la ou les chaînes de requête dans le bon format.

CubicleSoft
la source
2

Comme indiqué dans https://serverfault.com/a/875414/333439 , il est possible d'afficher la structure de la table dans la base de données avec la \d <table>méta-commande in psql. Si vous souhaitez afficher la requête utilisée dans la méta-commande, vous pouvez utiliser la commande psql -E. Comme décrit dans la page de manuel, le -Ecommutateur renvoie les \drequêtes de méta-commandes. Donc, vous pouvez lancer psql -E, vous pouvez afficher la structure de la table avec la \d <table>méta-commande, et, en fonction du -Ecommutateur, vous pouvez afficher la requête générée pour décrire la structure de la table

Enrico Bianchi
la source
0

Dans pgAdmin 4 , trouvez simplement la table dans l'arborescence à gauche, par exemple:

Servers
+ PostgreSQL 11
  + Databases
    + MYDATABASENAME
      + Schemas
        + public
          + Tables
            + MYTABLENAME  <-- click this tree element

Lorsque la table est sélectionnée, ouvrez l' onglet SQL à droite. Il affiche le CREATE TABLEpour la table sélectionnée.

Christopher K.
la source