Comment obtenir une liste des noms de colonne et du type de données d'une table dans PostgreSQL?

91

Avec la requête suivante, nous pouvons obtenir une liste des noms de colonnes et du type de données d'une table dans PostgreSQL.

Pratik
la source

Réponses:

133

Ouvrez la psqlligne de commande et tapez:

\d+ table_name
Marouane Afroukh
la source
1
Je ne comprends pas pourquoi ce n'est pas la réponse la plus votée.
mjezzi
18
Ceci est incomplet car OP peut vouloir le faire par programme dans le code SQL, pas seulement via psql.
Luke
Postgres le fait par programme, alors démarrez simplement postgres avec le drapeau '-E': psql -Eet pour chaque commande anti-slash, le SQL respectif sera affiché avant le résultat de la commande.
karatedog
115
select column_name,data_type 
from information_schema.columns 
where table_name = 'table_name';

avec la requête ci-dessus, vous pouvez colonnes et son type de données

Selva
la source
4
Cela ne donnera pas la bonne réponse pour les types définis par l'utilisateur (par exemple, les colonnes Geometry et Geography créées par ogr2ogr , qui sont de la forme geometry(Geometry,[SRID])).
GT.
1
On peut également utiliser table_catalog = 'my_database'et table_schema = 'my_schema'pour obtenir uniquement des colonnes d'une table spécifique d'un schéma spécifique d'une base de données spécifique.
Marco Mannes
24
SELECT
        a.attname as "Column",
        pg_catalog.format_type(a.atttypid, a.atttypmod) as "Datatype"
    FROM
        pg_catalog.pg_attribute a
    WHERE
        a.attnum > 0
        AND NOT a.attisdropped
        AND a.attrelid = (
            SELECT c.oid
            FROM pg_catalog.pg_class c
                LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
            WHERE c.relname ~ '^(hello world)$'
                AND pg_catalog.pg_table_is_visible(c.oid)
        );

Changez le monde Hello avec le nom de votre table

Plus d'informations à ce sujet: http://www.postgresql.org/docs/9.3/static/catalog-pg-attribute.html

Pratik
la source
2
Fonctionne, mais pourquoi utilisez-vous c.relname ~ '^(hello world)$au lieu de simplement c.relname = 'hello world'?
Thomas
18

N'oubliez pas d'ajouter le nom du schéma au cas où vous auriez plusieurs schémas avec les mêmes noms de table.

SELECT column_name, data_type 
FROM information_schema.columns
WHERE table_name = 'your_table_name' AND table_schema = 'your_schema_name';

ou en utilisant psql:

\d+ your_schema_name.your_table_name
BatCat
la source
7

Mise à jour de la réponse Pratik pour prendre en charge plus de schémas et de nullables:

SELECT
    "pg_attribute".attname                                                    as "Column",
    pg_catalog.format_type("pg_attribute".atttypid, "pg_attribute".atttypmod) as "Datatype",

    not("pg_attribute".attnotnull) AS "Nullable"
FROM
    pg_catalog.pg_attribute "pg_attribute"
WHERE
    "pg_attribute".attnum > 0
    AND NOT "pg_attribute".attisdropped
    AND "pg_attribute".attrelid = (
        SELECT "pg_class".oid
        FROM pg_catalog.pg_class "pg_class"
            LEFT JOIN pg_catalog.pg_namespace "pg_namespace" ON "pg_namespace".oid = "pg_class".relnamespace
        WHERE
            "pg_namespace".nspname = 'schema'
            AND "pg_class".relname = 'table'
    );
Honza Kuchař
la source
7

Une version qui prend en charge la recherche des noms de colonne et des types d'une table dans un schéma spécifique, et utilise des JOINs sans aucune sous-requête

SELECT
    pg_attribute.attname AS column_name,
    pg_catalog.format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS data_type
FROM
    pg_catalog.pg_attribute
INNER JOIN
    pg_catalog.pg_class ON pg_class.oid = pg_attribute.attrelid
INNER JOIN
    pg_catalog.pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE
    pg_attribute.attnum > 0
    AND NOT pg_attribute.attisdropped
    AND pg_namespace.nspname = 'my_schema'
    AND pg_class.relname = 'my_table'
ORDER BY
    attnum ASC;
Michal Charemza
la source
2
    SELECT DISTINCT
        ROW_NUMBER () OVER (ORDER BY pgc.relname , a.attnum) as rowid , 
        pgc.relname as table_name ,
        a.attnum as attr,
        a.attname as name,
        format_type(a.atttypid, a.atttypmod) as typ,
        a.attnotnull as notnull, 
        com.description as comment,
        coalesce(i.indisprimary,false) as primary_key,
        def.adsrc as default
    FROM pg_attribute a 
    JOIN pg_class pgc ON pgc.oid = a.attrelid
    LEFT JOIN pg_index i ON 
        (pgc.oid = i.indrelid AND i.indkey[0] = a.attnum)
    LEFT JOIN pg_description com on 
        (pgc.oid = com.objoid AND a.attnum = com.objsubid)
    LEFT JOIN pg_attrdef def ON 
        (a.attrelid = def.adrelid AND a.attnum = def.adnum)
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = pgc.relnamespace

    WHERE 1=1 
        AND pgc.relkind IN ('r','')
        AND n.nspname <> 'pg_catalog'
        AND n.nspname <> 'information_schema'
        AND n.nspname !~ '^pg_toast'

    AND a.attnum > 0 AND pgc.oid = a.attrelid
    AND pg_table_is_visible(pgc.oid)
    AND NOT a.attisdropped
    ORDER BY rowid
    ;
Yordan Georgiev
la source
2

Pour rendre ce sujet «plus complet».

J'avais besoin des noms de colonne et des types de données sur une instruction SELECT (pas une table).

Si vous souhaitez effectuer cette opération sur une instruction SELECT au lieu d'une table existante réelle, vous pouvez effectuer les opérations suivantes:

DROP TABLE IF EXISTS abc;
CREATE TEMPORARY TABLE abc AS
-- your select statement here!
SELECT 
    *
FROM foo
-- end your select statement
;

select column_name, data_type 
from information_schema.columns 
where table_name = 'abc';
DROP IF EXISTS abc;

Brève explication, il crée une table (temporaire) de votre instruction select, que vous pouvez 'appeler' via la requête fournie par (entre autres) @a_horse_with_no_name et @selva.

J'espère que cela t'aides.

Jens van Hellemondt
la source
2

sans mentionner le schéma, vous pouvez également obtenir les détails requis Essayez cette requête->

sélectionnez nom_colonne, type_données dans schema_informations.colonnes où nom_table = 'nom_table';

abhinav kumar
la source
0

Pour obtenir des informations sur la colonne de la table, vous pouvez utiliser:

\dt+ [tablename]

Pour obtenir des informations sur le type de données dans la table, vous pouvez utiliser:

\dT+ [datatype]
bizi
la source
1
\ dt + nom_table obtenir les informations sur la table, mais pas la colonne
zhihong
0

sélectionnez column_name, data_type dans information_schema.columns où table_name = 'your_table_name' et table_catalog = 'your_database_name' et table_schema = 'your_schema_name';

Surendra babu Pasumarhti
la source