1994 votes

PostgreSQL : "DESCRIBE TABLE".

Comment exécuter l'équivalent de l'outil Oracle DESCRIBE TABLE dans PostgreSQL (en utilisant la commande psql) ?

2990voto

Chris Bunch Points 25857

Essayez ceci (dans le psql outil de ligne de commande) :

\d+ tablename

Voir le manuel pour plus d'informations.

10 votes

J'avais initialement accepté la réponse de devinmoore, mais je préfère celle-ci. Non seulement elle décrit la table, mais elle montre aussi les métadonnées telles que les descriptions des colonnes et s'il y a des OIDs.

32 votes

El + est vraiment embrayée, car PostgresSQL 9 ne donne la description approfondie des vues que lorsque vous faites \d+ table_name plutôt que la simple \d table_name

13 votes

\d ne fonctionne pas lorsque vous l'invoquez dans PosgreSQL 9.1 via pgAdmin, la réponse de Vinko ci-dessous s'applique à plus de cas.

833voto

Vinko Vrsalovic Points 116138

En plus de la méthode PostgreSQL ( \d quelque chose" ou \dt table" ou \ds séquence" et ainsi de suite)

La méthode standard SQL, comme indiqué ici :

select column_name, data_type, character_maximum_length, column_default, is_nullable
from INFORMATION_SCHEMA.COLUMNS where table_name = '<name of table>';

Il est supporté par de nombreux moteurs de recherche.

25 votes

Sélectionnez le nom de la colonne, le type de données et la longueur maximale des caractères dans INFORMATION_SCHEMA.COLUMNS où le nom de la table = 'table' ;

8 votes

C'est plus utile que \d quand vous êtes coincé avec un psql pré-8.4 et un serveur post-8.4 - la \d est incompatible.

31 votes

Cette commande s'exécute également contre RedShift, où \d+ ne le fait pas. C'est la meilleure réponse IMO

75voto

Gavin M. Roy Points 1501

Si vous voulez l'obtenir à partir d'une requête au lieu de psql, vous pouvez interroger le schéma du catalogue. Voici une requête complexe qui fait cela :

SELECT  
    f.attnum AS number,  
    f.attname AS name,  
    f.attnum,  
    f.attnotnull AS notnull,  
    pg_catalog.format_type(f.atttypid,f.atttypmod) AS type,  
    CASE  
        WHEN p.contype = 'p' THEN 't'  
        ELSE 'f'  
    END AS primarykey,  
    CASE  
        WHEN p.contype = 'u' THEN 't'  
        ELSE 'f'
    END AS uniquekey,
    CASE
        WHEN p.contype = 'f' THEN g.relname
    END AS foreignkey,
    CASE
        WHEN p.contype = 'f' THEN p.confkey
    END AS foreignkey_fieldnum,
    CASE
        WHEN p.contype = 'f' THEN g.relname
    END AS foreignkey,
    CASE
        WHEN p.contype = 'f' THEN p.conkey
    END AS foreignkey_connnum,
    CASE
        WHEN f.atthasdef = 't' THEN d.adsrc
    END AS default
FROM pg_attribute f  
    JOIN pg_class c ON c.oid = f.attrelid  
    JOIN pg_type t ON t.oid = f.atttypid  
    LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = f.attnum  
    LEFT JOIN pg_namespace n ON n.oid = c.relnamespace  
    LEFT JOIN pg_constraint p ON p.conrelid = c.oid AND f.attnum = ANY (p.conkey)  
    LEFT JOIN pg_class AS g ON p.confrelid = g.oid  
WHERE c.relkind = 'r'::char  
    AND n.nspname = '%s'  -- Replace with Schema name  
    AND c.relname = '%s'  -- Replace with table name  
    AND f.attnum > 0 ORDER BY number
;

C'est assez complexe mais cela vous montre la puissance et la flexibilité du catalogue système de PostgreSQL et devrait vous permettre de maîtriser pg_catalog ;-). Assurez-vous de changer les %s dans la requête. Le premier est Schema et le second est le nom de la table.

3 votes

Cette requête est mieux présentée ici notent qu'ils suggèrent " \d table" aussi

4 votes

L'un des avantages de cette solution est que format_type() inclura tous les modificateurs attachés au type, par ex. numeric(6,2) ; considérant que information_schema.columns ne signalera que le type de base de numeric .

3 votes

Comment puis-je séparer le type de données de la taille ? disons | caractère variable(50) | à 2 colonnes : | caractère variable | 50 |

58voto

devinmoore Points 2172

Vous pouvez le faire avec une commande psql slash :

 \d myTable describe table

Cela fonctionne également pour d'autres objets :

 \d myView describe view
 \d myIndex describe index
 \d mySequence describe sequence

Source : faqs.org

37voto

Mr. Muskrat Points 2352

L'équivalent psql de DESCRIBE TABLE es \d table .

Voir la partie psql du manuel PostgreSQL pour plus de détails.

3 votes

Aussi, la sélection de la base de données psql est \c databasename plutôt que use databasename (pour ceux qui viennent de MySQL comme moi :-). Sans \c databasename d'abord, \d tablename produit No relations found. et rien de plus.

0 votes

Eh bien, tu peux juste \d databasename.tablename aussi. Avec une citation appropriée si nécessaire, c'est à dire \d "DatabaseName"."TableName" si vos noms ne sont pas tous en minuscules.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X