149 votes

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

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

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

78voto

alvosu Points 8259

Pg_dump :

pg_dump -st tablename dbname

ou utiliser les outils GUI de PostgreSQL (pgAdmin, phpPgAdmin, etc.).

60voto

edmz Points 111

Vous pouvez essayer de retracer dans le fichier journal de PostgreSQL ce qui suit pg_dump --table table --schema-only le fait vraiment. Vous pouvez ensuite utiliser la même méthode pour écrire votre propre fonction sql.

45voto

kevinmicke Points 181

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

18voto

Eli Points 575

En vous basant sur la première partie de la réponse de @CubicalSoft, vous pouvez ajouter la fonction suivante qui devrait fonctionner pour les tables simples (en supposant le schéma 'public' par défaut et en omettant les contraintes, les index et les types de données définis par l'utilisateur, etc. etc.) La réponse de @RJS est la seule façon de le faire correctement pour le moment ; c'est quelque chose qui devrait être intégré dans 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;

14voto

cloudhead Points 10279

Je me rends compte que j'arrive un peu tard, mais c'était le premier résultat de ma recherche Google, alors je me suis dit que j'allais vous répondre 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 ensuite 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 dans le bon format.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X