web-dev-qa-db-fra.com

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

Existe-t-il un équivalent de MySQL SHOW CREATE TABLE à Postgres? Est-ce possible? Sinon, quelle est la meilleure solution suivante?

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

82
vlebar

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.

30
RJS

pg_dump:

pg_dump -st tablename dbname

ou utilisez les outils graphiques de PostgreSQL (pgAdmin, phpPgAdmin, etc.)

49
alvosu

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

20
Lukasz Czerwinski

En s'appuyant sur la première partie de la réponse de @ CubicalSoft, vous pouvez insérer la fonction suivante qui devrait fonctionner pour les tables simples (suppose le schéma `` public '' par défaut et omet les contraintes, les index et les types de données définis par l'utilisateur, etc., etc.). La réponse @RJS est la seule façon 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;
7
EoghanM

Je me rends compte que je suis un peu en retard à cette fête, mais c'était le premier résultat de ma recherche Google, alors j'ai pensé que je répondrais avec ce que j'ai trouvé.

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

Il s'agit ensuite de construire la ou les chaînes de requête au bon format.

6
CubicleSoft

Comme répondu dans https://serverfault.com/a/875414/333439 , avec le \d <table> la méta-commande dans psql est possible d'afficher la structure de la table dans la base de données. 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 -E switch fait écho au \d requêtes de méta-commandes. Vous pouvez donc lancer psql -E, vous pouvez afficher la structure de la table avec \d <table> méta-commande et, selon -E switch, vous pouvez voir la requête générée pour décrire la structure de la table

2
Enrico Bianchi

Dans pgAdmin 4 , il suffit de trouver le tableau dans l'arborescence à gauche, par exemple:

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

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

0
Christopher K.

L'extension Postgres ddlx ( https://github.com/lacanoid/pgddl ) fait exactement cela et plus encore.

0
Žiga